2011-04-17 154 views
4

我不知道我是否以正确的方式接近问题。预期的结果是具有仅显示namedescription的表单。一旦用户提交表单,我想将当前用户添加为owner,并检查是否已有一个条目具有相同的nameuser。如果有,我想要返回错误的表单。如果不是,我想保存Status验证Django中的唯一字段

我的模型:

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') 

笔者认为:

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)) 

我已经试过无数的东西,但我一直运行到这个问题,如果我添加owner对象分开那么它不是” t可用于型号的clean功能,因此不能用于检查nameowner是否是唯一的。

回答

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 

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)) 

另请参阅根据您的表单设置设置初始数据并考虑使用ModelForm。

相关问题