2017-02-19 25 views
0

Я написал следующий вид:Migrate форма для 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() 
        } 

EDIT: Вот модели:

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 вы исключите все поля модели Вопросов, которые не требуются.

После этого в init вы предоставите выбор набора предоставленного экземпляра в поле выбора.

Код написан на сайте и не проверен, но я думаю, он должен работать.