验证Django中的唯一字段

Ben*_*n S 4 django unique save

我不知道我是否正在以正确的方式解决问题.预期结果是具有仅显示name和的表单description.一旦用户提交表单我想添加当前用户owner并检查是否已经有一个具有相同name和的条目user.如果有,我想返回有错误的表单.如果没有,我想保存Status.

我的模特:

class Status(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True)
    owner = models.ForeignKey(User)
    active = models.BooleanField(default=True)

    class Meta:
        unique_together = ('name','owner')
Run Code Online (Sandbox Code Playgroud)

我的看法:

def settings_status(request):
    status_form = StatusForm()

    if request.method == 'POST':
        status_form = StatusForm(request.POST)
            if status_form.is_valid():
                new_status = Status()
                new_status.name = status_form.cleaned_data['name']
                new_status.description = status_form.cleaned_data['description']
                new_status.owner = request.user
                new_status.save()

    return render_to_response('base/settings_status.html',{
        'status_form'           :       status_form,
}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

我已经试了无数的东西,但我一直运行到这个问题,如果我添加owner到对象分开那么它是不是适用于模型的clean功能,因此不能被用来检查nameowner是唯一的.

DTi*_*ing 5

几种方法:

例如,将用户(所有者)传递给表单:

forms.py:

class StatusForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user','')
        super(StatusForm, self).__init__(*args, **kwargs)
        self.fields['name'] = forms.CharField(label='Name')
        self.fields['description'] = CharField(label='Description', widget=forms.Textarea)

    def clean(self):
        cleaned_data = self.cleaned_data
        name = cleaned_data.get('name')

        if Status.objects.filter(name=name, owner=self.user).exists():
            self._errors['name'] self.error_class(['Status with this name exists'])  

        return cleaned_data
Run Code Online (Sandbox Code Playgroud)

views.py:

def settings_status(request):

    if request.method == 'POST':
        status_form = StatusForm(request.POST, user=request.user)
            if status_form.is_valid():
                new_status = Status()
                new_status.name = status_form.cleaned_data['name']
                new_status.description = status_form.cleaned_data['description']
                new_status.owner = request.user
                new_status.save()
    else:
        status_form = StatusForm(user=request.user)

    context = {'status_form':status_form,}

    return render_to_response('base/settings_status.html', context,
                context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

另请参阅根据表单设置设置初始数据,并考虑使用ModelForm.