Как обрабатывать форму и набор форм на одной странице? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть форма и набор форм для одной и той же модели. Первая форма, которую я имею, написана на HTML, потому что мне нужны были какие-то виджеты, которых у Django нет в коробке.

models.py

class MyModel(models.Model):
    name = models.CharField(max_length=255, null=True, blank=True)
    phone_number = models.CharField(max_length=255, null=True, blank=True)
    some_other_field = models.CharField(max_length=255, null=True, blank=True)

views.py

class MyView(View):
    def get(self, request):
        formset = modelformset_factory(MyModel, fields=('name', 'some_other_field', extra=2)
        return render(request, 'index.html', context={'formset': formset})

    def post(self, request):
        formset = modelformset_factory(MyModel, request.POST, fields=('name', 'some_other_field'))
        if formset.is_valid(): 
            formset.save()
            MyModel.objects.create(name=request.POST.get('name'))
            return HttpResponse("done")

index. html

<form method="post" action="">
    <input type="text" name="name">
    {{ formset.management_form }}
    {% for form in formset %}
        {{form}}
    {% endfor %}
</form>

Это не работает вообще , вызвать запрос. POST отправляет все несоответствующие данные в набор моделей, например, в этом случае в поле name, и я получаю эту ошибку.

AttributeError: 'QueryDict' object has no attribute '__name__'

1 Ответ

1 голос
/ 09 апреля 2020

Это не то, как вы используете modelformset_factory, вы не можете передать ему данные. modelformset_factory возвращает класс , который затем можно создать для передачи ему данных. Вы читали это ?

Итак, сначала вам нужно создать класс:

MyModelFormset = modelformset_factory(MyModel, fields=(...), extra=...)

Затем вы создадите его экземпляр:

formset = MyModelFormset()
# or
formset = MyModelFormset(request.POST)

или вы можете сделать это сразу:

formset = modelformset_factory(MyModel, fields=..., extra=...)(request.POST)
...