2010-06-16 128 views
6

在車型:Django模型避免重複

class Getdata(models.Model): 
    title = models.CharField(max_length=255) 
    state = models.CharField(max_length=2, choices=STATE, default="0") 
    name = models.ForeignKey(School) 
    created_by = models.ForeignKey(profile) 

    def __unicode__(self): 
     return self.id() 

模板:

<form> 
    <input type="submit" value="save the data" /> 
</form> 

如果用戶點擊保存按鈕和上面的數據保存在表中,如何避免重複即,如果用戶再次點擊相同的提交按鈕,則不應該有相同值的另一個條目。還是這是必須在視圖中處理的東西?

回答

16

如果單個字段必須是唯一的,那麼你只需要添加unique=True

class Getdata(models.Model): 
    title = models.CharField(max_length=255, unique=True) 
    state = models.CharField(max_length=2, choices=STATE, default="0") 
    name = models.ForeignKey(School) 
    created_by = models.ForeignKey(profile) 

如果你想字段的組合是唯一的,你需要unique_together

class Getdata(models.Model): 
    title = models.CharField(max_length=255) 
    state = models.CharField(max_length=2, choices=STATE, default="0") 
    name = models.ForeignKey(School) 
    created_by = models.ForeignKey(profile) 
    class Meta: 
     unique_together = ["title", "state", "name"] 
+0

謝謝....................... – Hulk 2010-06-16 12:09:52

+0

另外,當默認情況下在第二個示例的視圖中調用getdata時,將返回「title」 ,「國家」和「名稱」是嗎? – Hulk 2010-06-16 12:14:36

+0

當您在視圖中引用Getdata對象時,會得到一個Getdata對象及其所有字段。 – 2010-06-16 12:19:00

2

的unique_together也建議是最好的方法,但如果這不適合您的需求,您可以在表單的乾淨方法中處理它。例如

def clean(self): 
    try: 
     Getdata.objects.get(title=self.cleaned_data['title'], 
          state=self.cleaned_data['state'], 
          name=self.cleaned_data['name'], 
          created_by=self.cleaned_data['created_by']) 
     #if we get this far, we have an exact match for this form's data 
     raise forms.ValidationError("Exists already!") 
    except Getdata.DoesNotExist: 
     #because we didn't get a match 
     pass 

    return self.cleaned_data 
+0

謝謝,很好的解釋.. – Hulk 2010-06-16 12:11:56

+1

我也看到,對於多重提交的情況,人們放入JavaScript時禁用提交按鈕,當它被點擊並且窗體是提交。最好的解決方案可能是所有這些的組合。 – 2010-06-16 12:21:49

+0

在我的代碼中我暫時做了同樣的事情..但是這與其他人不一致..所以我不得不知道這個..下次我可以使用正確的代碼而不是黑客。 – Hulk 2010-06-16 12:45:22

1

我想注入一個Jquery/JS代碼來隱藏保存按鈕將是一個好主意。

創建custom_validate.js文件,如下圖所示,並將其放置在目錄靜態(靜態文件的目錄)

if (!$) { 
    $ = django.jQuery; 
} 

$(document).ready(function() { 
    $("[name=_save]").click(function() { 
     $("[name=_save]").css("visibility", "hidden"); 
    }); 
}); 

而且在admin.py,添加下面的代碼。

class CustomDataForm(forms.ModelForm): 

    class Meta: 
     model = GetData 

class GetDataAdmin(admin.ModelAdmin): 
    # .... 
    ..... 
    form = CustomDataForm 

    class Media: 
     js = ('/static/custom_validate.js',)