Учтите, что в моей базе данных есть 2 существующих экземпляра MyModel.
Мой InlineFormSet отображает как существующие экземпляры, так и 1 дополнительный.
Формы с существующими экземплярами можно изменить только state
Формы с дополнительными полями можно изменить
Как этого добиться?
====
(пользователь может редактировать жирный шрифт; курсив заблокирован)
[MyModel1 Name] . , [MyModel1 State]
[MyModel2 Name] . , [MyModel2 State]
[NewExtra Name]. , [NewExtra State] <- оба можно изменить <br>
====
Я пытался использовать {{ form.name.instance }}
против {{ form.name }}
Но я не знаю, как отличить существующие экземпляры от дополнительных.
# forms.py
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ["name", "state"]
MyModelFormSet = inlineformset_factory(
MyParent, MyModel, form=MyModelForm, can_delete=False, extra=1
)
# views.py
class UpdateMyModelsView(UpdateView):
template_name = "update_mymodel.html"
model = MyParent
fields=[]
success_url = reverse_lazy('update_success')
def get_object(self, *args, **kwargs):
return MyParent.objects.get(admin=self.request.user)
def get_context_data(self, **kwargs):
context = super(UpdateMyModelsView, self).get_context_data(**kwargs)
parent= MyParent.objects.get(admin=self.request.user)
context['parent'] = parent
if self.request.POST:
context['mymodel_formset'] = MyModelFormSet(self.request.POST, instance=self.object)
else:
context['mymodel_formset'] = MyModelFormSet(instance=self.object)
return context
def form_valid(self, form):
context = self.get_context_data()
mymodel_formset= context['mymodel_formset']
with transaction.atomic():
self.object = context['parent']
if mymodel_formset.is_valid():
mymodel_formset.instance = self.object
mymodel_formset.save()
else:
return super(UpdateMyModelsView, self).form_invalid(form)
return super(UpdateMyModelsView, self).form_valid(form)
# update_mymodel.html
<form method="POST" class="pretty-form">
{% csrf_token %}
{{ mymodel_formset.management_form }}
{% for form in mymodel_formset.forms %}
{{ form.non_field_errors }}
{% for hidden_field in form.hidden_fields %}
{{ hidden_field.errors }}
{{ hidden_field }}
{% endfor %}
{% for field in form.visible_fields %}
<div class="field-wrapper">
{{ field.label_tag }}
{{ field }}
{% if field.name in form.errors.keys %}
{{ field.errors }}
{% endif %}
</div>
{% endfor %}
{% endfor %}
<input type="submit" name="_edit-mymodel" value="Submit Changes">
</form>