2015-06-02 2 views
0

Я создаю приложение Poll с этими моделямиДжанго - Сохранение ModelForm с внешним ключом от другой модели

class Poll(BaseModel): 
    title = models.CharField(max_length=255) 
    end_date = models.DateField() 

class Choice(BaseModel): 
    poll = models.ForeignKey('Poll') 
    choice = models.CharField(max_length=255) 
    index = models.IntegerField() 

Опроса может иметь много вариантов - сумма будет варьироваться для каждого опроса. Я изо всех сил пытаюсь понять, как сохранить опрос через модельную форму и в то же время сохранить связанные с ней варианты.

Я знаю, что мне нужно переопределить методы «Сохранить и очистить» в моей программе PollForm, но после этого он становится запутанным. Я знаю, что есть более пифонический/djangoesque способ сделать это. Моя основная путаница - это отношения между выбором и опросом, потому что он определен только в одном направлении.

Кроме того, я не могу понять, как это будет работать при обновлении опроса с помощью набора вариантов, где некоторые существуют, а некоторые - новые. Следующий код не работает, конечно, но это то, как я подхожу к размышлению об этом. Я был бы признателен за толкание в правильном направлении!

class PollForm: 
    def save(self, choices, commit=True, *args, **kwargs): 

    poll = super(PollForm, self).save(commit=False, *args, **kwargs) 

    if commit: 

     p = poll.save() 

     for choice in choices: 
     choice['poll_id'] = p.id 

     if choice['id']: 
      c = ChoiceForm(choice, instance=Choice.objects.get(id=choice['id'])) 
     else: 
      c = ChoiceForm(choice) 

     if c.is_valid(): 
      c.save() 

    return poll 

ответ

0

Что вам нужно Django FormSets (https://docs.djangoproject.com/en/1.8/topics/forms/formsets/), а именно: модель FormSets (https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#model-formsets). Для вашей модели вы должны использовать встроенный набор форм (для модели выбора). Вы можете найти всю информацию о них в: https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#inline-formsets.

Надеюсь, это поможет.

Смежные вопросы