2010-06-16 130 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',)