2013-03-22 27 views
1

我想在驗證之前在視圖中設置字段值'user',如下面的示例中所示。但我仍然得到驗證消息用戶是必需的,暗示它沒有被設置。我做錯了什麼?在表單驗證前設置字段值'user'

感謝,

view.py

def add_batch(request): 
    # If we had a POST then get the request post values. 
    if request.method == 'POST': 

     form = BatchForm(data=request.POST, initial={'user': request.user}) 
     # Check we have valid data before saving trying to save. 
     if form.is_valid(): 
      # Clean all data and add to var data. 
      data = form.cleaned_data 
      groups = data['groups'].split(",") 
      for item in groups: 
       batch = Batch(content=data['content'], 
           group=Group.objects.get(pk=item), 
           user=request.user 
          ) 
       batch.save() 
      return redirect(batch.get_send_conformation_page()) 
     else: 
      context = {'form': form} 
      return render_to_response('sms/sms_standard.html', context, context_instance=RequestContext(request)) 

form.py

class BatchForm(forms.ModelForm): 

    class Meta: 
     model = Batch 

    def __init__(self, user=None, *args, **kwargs): 
     super(BatchForm, self).__init__(*args,**kwargs) 
     if user is not None: 
      form_choices = Group.objects.for_user(user) 
     else: 
      form_choices = Group.objects.all() 
     self.fields['groups'] = forms.ModelMultipleChoiceField(
      queryset=form_choices 
     ) 

回答

5

作爲the documentation解釋,initial值不用於噸o在表單中設置數據,它們僅用於顯示,以及初始值。

如果您不想顯示用戶但想自動設置它,最好的辦法是從ModelForm中完全排除用戶字段,並在保存時將其設置在視圖中。或者,由於您將其作爲參數傳遞給其他原因,因此您可以將其添加到POST數據中:

def __init__(self, user=None, *args, **kwargs): 
    super(BatchForm, self).__init__(*args,**kwargs) 
    if user is not None: 
     if self.data: 
      self.data['user'] = user 
+0

O我忘了關於'排除',並感謝解釋初始化 – MarkO 2013-03-22 11:59:24

+2

是不是'self.data'是不可變的? – steppo 2015-10-16 09:17:01

0
form = BatchForm(request.user, request.POST) 
# Check we have valid data before saving trying to save. 
if form.is_valid(): 
    [.........] 
+0

似乎仍然給出此字段是必填'用戶'。 – MarkO 2013-03-22 11:34:50

+0

你可以發佈你的錯誤追蹤 – catherine 2013-03-22 11:40:12

+0

我認爲它應該是'form = BatchForm(user = request.user,data = request.POST)' – 2013-03-22 11:41:43