2017-02-19 42 views
0

我寫以下形式:遷移形式的ModelForm

class VoteForm(forms.Form): 
    choice = forms.ModelChoiceField(queryset=None, widget=forms.RadioSelect) 

    def __init__(self, *args, **kwargs): 
     question = kwargs.pop('instance', None) 
     super().__init__(*args, **kwargs) 

     if question: 
      self.fields['choice'].queryset = question.choice_set 

class VoteView(generic.UpdateView): 
    template_name = 'polls/vote.html' 
    model = Question 
    form_class = VoteForm 

    def get_queryset(self): 
     return Question.objects.filter(pub_date__lte=timezone.now()).exclude(choice__isnull=True) 

    def get_context_data(self, **kwargs): 
     context = super().get_context_data(**kwargs) 
     # Check duplicate vote cookie 
     cookie = self.request.COOKIES.get(cookie_name) 
     if has_voted(cookie, self.object.id): 
      context['voted'] = True 
     return context 

    def get_success_url(self): 
     return reverse('polls:results', args=(self.object.id,)) 

    def form_valid(self, form): 
     redirect = super().form_valid(form) 

     # Set duplicate vote cookie. 
     cookie = self.request.COOKIES.get(cookie_name) 
     half_year = timedelta(weeks=26) 
     expires = datetime.utcnow() + half_year 
     if cookie and re.match(cookie_pattern, cookie): 
      redirect.set_cookie(cookie_name, "{}-{}".format(cookie, self.object.id), expires=expires) 
     else: 
      redirect.set_cookie(cookie_name, self.object.id, expires=expires) 

     return redirect 

的問題是,正常形式不表示一個對象不具有像的ModelForm的保存()方法。但我無法弄清楚如何遷移表單。沒有選擇或choice_set場:

class VoteForm(forms.ModelForm): 
    class Meta: 
     Model = Question 
     #throws exception 
     fields = ('choice',) 
     widgets = { 
      'choice': forms.RadioSelect() 
        } 

編輯: 下面是型號:

class Question(models.Model): 
    question_text = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 

class Choice(models.Model): 
    question = models.ForeignKey(Question, on_delete=models.CASCADE) 
    choice_text = models.CharField(max_length=200) 
    votes = models.IntegerField(default=0) 

如何從上面的形式再現爲的ModelForm?

+0

請顯示您的模型。 – knbk

+0

我添加了模型。 – R3turnz

回答

1

即使您有ModelForm,如果您需要它們也可以定義其他字段。在你的情況下,它將是以前的正常形式的選擇字段。

然後在Meta中,您將排除Question模型中不需要的所有字段。

之後,在init中,您將提供一組選定字段提供的實例。

class VoteForm(forms.ModelForm): 
    choice = forms.ModelChoiceField(queryset=None, widget=forms.RadioSelect) 

    class Meta: 
     model = Question 
     exclude = ['question_text','pub_date'] 

    def __init__(self, *args, **kwargs): 
     super(VoteForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     if instance: 
      self.fields['choice'].queryset = instance.choice_set 

的代碼寫在網上,而不是測試,但我認爲它應該工作。