Джанго: Перезапись формы.как сократить отображение полей? - PullRequest
0 голосов
/ 19 сентября 2019

Я тестирую формы и вложение моделей в django.

Из-за отношения ManyToMany в моей форме мне нужно использовать пользовательскую функцию сохранения.Пока это работает.Но я спросил себя, есть ли способ сократить код?Так вот мой мой ...

forms.py

GuestForm(forms.ModelForm):

    dish = forms.ModelChoiceField(queryset=None)

    # --- Input for meal.table
    table_input = forms.IntegerField(widget=forms.NumberInput)

    class Meta:
        model = Guest
        fields = [ 
            'name',
            'dish',
            'table_input',
            'city',
            'department'
            ]


     # --- Dish names from dish.model
    def __init__(self, *args, **kwargs):
        super(GuestForm, self).__init__(*args, **kwargs)
        self.fields['dish'].queryset = Dish.objects.all()


    def save(self):
        # --- save the new Meal.object
        data = self.cleaned_data
        mealData = Meal(table=data['table_input'], dish=data['dish'])
        mealData.save()

        # --- save the new Guest.object 
        guestData = Guest(name=data['name'], city=data['city'], department=data['department'])
        guestData.save()

        # --- add a m2m relation between Guest.object and Meal.object
        guestData.meals.add(mealData)
        guestData.save()

        return guestData

Вопрос

Мой вопрос особенно связан с отображением всех полей после того, как я сохранил mealData.save().

# --- save the new Guest.object 
guestData = Guest(name=data['name'], city=data['city'], department=data['department'])
guestData.save()

Потому что в больших проектах это может означать большую работу, чтобы впоследствии сопоставить каждое поле только потому, что мне нужно было table и dish для сохранения в дополнительной модели.Или, другими словами, есть какой-то метод выбора?Что-то вроде «все поля данных, все еще относящиеся к Meta: model = Guest минус данные из mealData»?Я не знаю, может быть, что-то вроде этого?

# --- Select all other fields and save the new Guest.object 
guestData = Guest.minus(guestData)
guestData.save()

1 Ответ

1 голос
/ 19 сентября 2019

Ваша форма ModelForm для модели Guest, поэтому она "знает", как сохранить Guest, даже если есть дополнительные поля и дополнительные данные: super().save() фактически сохранит экземпляр вашей модели иверни это.Для mealData ярлыка нет.

 def save(self, commit=True):
     guestData = super().save(commit)  # this saves the model
     mealData = ...
     if commit:
         mealData.save()
         guestData.meals.add(mealData)  # no need to save guestData again!
     return guestData

Теперь я добавил параметр commit, потому что это хорошая практика для форм моделей (кто-то, пишущий представление, должен иметь возможность вызывать save(commit=False) в вашей форме).

Обратите внимание, что ваш атрибут fields в классе Meta содержит поля, которые не принадлежат модели Guest (dish и table_input), их следует удалить.Там должны отображаться только поля модели.

...