Django InlineFormSet дифференцирует существующие формы БД от дополнительных форм - PullRequest
0 голосов
/ 10 апреля 2020

Учтите, что в моей базе данных есть 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...