2016-04-17 76 views
0

我刚刚完成了电子邮件注册表单的Django教程,我试图调整代码的某些部分以匹配我的需要(向注册表单中添加一个附加字段)Django - 从数据库中保存表单的数据

基于我创建了一个电子邮件注册模型的形式教程:

class JoinForm(forms.ModelForm): 
    class Meta: 
     model = Join 
     fields = ["email","wunschrad"] 

,我加入了wunschrad

然后我更新了我的模型,包括wunschrad改变它一点点,同步的数据库与南方,所有的工作国王罚款。低于我的模型:

class Join(models.Model): 
    email = models.EmailField() 
    wunschrad = models.CharField(max_length=120) 
    friend = models.ForeignKey("self", related_name='referral', null=True, blank=True) 
    ref_id = models.CharField(max_length=120, default='ABC', unique=True) 
    ip_address = models.CharField(max_length=120, default='ABC') 
    timestamp = models.DateTimeField(auto_now_add = True, auto_now = False) 
    updated = models.DateTimeField(auto_now_add = False, auto_now = True) 

    def __unicode__(self): 
     return "%s" % (self.email) 

    class Meta: 
     unique_together = ("email", "ref_id",) 

我遇到问题的地方是如何采用我的观点来反映这种变化。下面是我做的(注释中强调我的变化)

def home(request): 
    try: 
     join_id = request.session['join_id_ref'] 
     obj = Join.objects.get(id=join_id) 
    except: 
     obj = None 

    form = JoinForm(request.POST or None) 
    if form.is_valid(): 
     new_join = form.save(commit=False) 
     email = form.cleaned_data['email'] 
     wunschrad = form.cleaned_data['wunschrad'] #I ADDED THIS 
     new_join_old, created = Join.objects.get_or_create(email=email, wunschrad=wunschrad) # I ADDED WUNSCHRAD HERE 
     if created: 
      new_join_old.ref_id = get_ref_id() 
      if not obj == None: 
       new_join_old.friend = obj 
      new_join_old.ip_address = get_ip(request) 
      new_join_old.save() 

     return HttpResponseRedirect("/%s" %(new_join_old.ref_id)) 


    context = {"form": form} 
    template = "home.html" 
    return render(request, template, context) 

我的问题/问题如下:这段代码的工作,但如果用户注册使用相同的电子邮件地址,并选择一次wunschrad的第一个选项第二次第二个选项(澄清:wunschrad是一个有两个选项的下拉列表)Django在数据库中保存两个版本,如下所示:Django Admin Screenshot

有没有人有一个想法如何改变代码每个用户只能保存一次?

很多人提前感谢您的帮助!

回答

0

所以你的问题在于通过添加wunschrad到get_or_create你告诉Django在数据库中查找包含这两个值而不仅仅是电子邮件的条目。它更改为这应该修复它:

new_join_old, created = Join.objects.get_or_create(email=email) 
new_join_old.wunschrad = wunschrad 
new_join_old.save() 

这将确保它仅创建一个新的对象,如果该电子邮件是不是已经在数据库中。

至于如果你希望你的电子邮件是唯一的,如果你试图保存同一个电子邮件另一条目添加独特= True以models.EmailField(引发错误)像一个侧面说明:

models.EmailField(unique=True) 
相关问题