Страница с формами для нескольких внешних ключей - PullRequest
0 голосов
/ 25 марта 2020

Учитывая следующие (упрощенные) модели:

class Person(models.Model):
    name = models.CharField(max_length=64)


class Weight(models.Model):
    person = models.ForeignKey(Person, verbose_name="Person")
    date = models.DateField("Date")
    weight = models.DecimalField("Weight", max_digits=4, decimal_places=1)

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

Так что я хочу создать страницу наподобие:

Person 1     Date: <pick date>     Weight: <enter weight>
Person 2     Date: <pick date>     Weight: <enter weight>
Person 3     Date: <pick date>     Weight: <enter weight>
Person 4     Date: <pick date>     Weight: <enter weight>
Person 5     Date: <pick date>     Weight: <enter weight>

<Save>

Это позволит сохранить информацию о весе 5 раз , один раз для каждого (другого) человека.

Я посмотрел на formsets и сопутствующую документацию, но похоже, что это больше для идентичных предметов и для генерации на лету больше (например, создание нескольких книг под одним автором). В моем случае каждый вес привязан к определенному человеку, но он отличается от строки к строке в таблице. Я думал, что опция prefix в наборе форм (для использования разных наборов форм на одной странице) может быть полезна здесь, но, глядя на документацию, я не уверен.

Что такое Django способ делать подобные вещи?

Другие вопросы по SO, относящиеся к похожие темы похоже, не соответствует моему варианту использования, если я что-то не замечаю.

1 Ответ

1 голос
/ 25 марта 2020

вы можете использовать formset и давать начальное значение для поля person в каждой форме:

forms.py

class WeightForm(forms.ModelForm):
    class Meta:
        model = Weight
        fields = '__all__'

views.py

persons = Persons.objects.all()
data = request.POST or None

WeightFormSet = formset_factory(form=WeightForm, extra=0)
formset = WeightFormSet(data=data, initial=[{'person': p} for p in persons])

if request.method == 'POST':
     ...
...