2016-10-28 2 views
0

Я использую эти 3 модели (упрощенно):Джанго: Заполнение отношения ManytoMany для каждой новой формы в formset

class Model1(models.Model): 
    field1 = models.CharField(max_length=25) 

class Model2(models.Model): 
    field1 = models.CharField(max_length=25) 

class Model3(models.Model): 
    model1 = models.ForeignKey(Model1) 
    model2 = models.ForeingKey(Model2) 

У меня есть форма для Model1 и formset для Model2s, что работать, но проблема в том, что для каждого Model2 в formet я хочу, чтобы там также была Model3, которая соединяет Model2 с Model1.

Как добавить модель 3, чтобы она заполнилась для каждой модели2 в наборе форм?
Я попытался найти решение, используя inlineformsets или modelformsets, но я до сих пор не понимаю их. Я даже не знаю, правильное ли это направление.

Я ищу все, что укажет мне в правильном направлении.

+1

Поскольку Model3 подключает только Model2 к Model1, кажется, что вам не нужны никакие пользовательские данные. Это так? В этом случае вы сможете достичь этого в логике сохранения формы. Это зависит от того, должны ли все экземпляры Model2 в представленном наборе форм связываться с представленным экземпляром Model1. – nimasmi

ответ

1

Предполагая, что мой вопрос выше в правильном направлении, а затем в POST-обработки части вашего зрения:

if model_one_form.is_valid() and model_two_formset.is_valid(): 
    obj_one = model_one_form.save() 
    for model_two_form in model_two_formset: 
     obj_two = model_two_form.save() 
     obj_three = Model3.objects.create(model1=obj_one, model2=obj_two) 

Это кажется, что-то это просто можно было бы сделать лучше, используя простой ManyToManyField, или если вы нужен доступ к Model3, затем тот же, но с использованием аргумента through. См. https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ManyToManyField.through Конечно, ваш случай может быть более сложным, чем вы указали в своем вопросе.

+0

Это именно то, что мне нужно. Я все еще изучаю Django и даже не понимаю, что для моделей существует функция создания. Спасибо! Что касается ManyToMany Fields, я хотел узнать, что встроенный материал Django делал за кулисами, поэтому я сам делал это сейчас. Я, вероятно, буду использовать встроенный материал, если он будет менее похож на магию и больше похож на более простой способ делать поля ManytoMany. – BarbarianBunny

+0

Это разумный подход. Вы можете думать о 'obj_one = Model1.objects.create (foo = bar)' как ярлыке для 'obj_one = Model1 (foo = bar); obj_one.save() '. – nimasmi

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