2016-04-17 78 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) 
相關問題