2011-04-17 87 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。

相關問題