Django: «Model2.user» должен быть экземпляром «User» - PullRequest
0 голосов
/ 05 июня 2018

У меня есть следующие модели:

class Model1(models.Model):
    Field1 = models.CharField(max_length=200)

class Model2(models.Model)
    Field2 = models.ForeignKey(Model1, on_delete=models.CASCADE)
    Field3 = models.ForeignKey(User, on_delete=models.CASCADE)
    Email = models.EmailField(null=TRUE)

А вот мой forms.py:

class Model1Form(ModelForm):
    class Meta:
        model = Model1
        fields = ['Field1']

class Model2Form(ModelForm):
    class Meta:
        model = Model2
        fields = ['email']


Model2Field2Formset = inlineformset_factory(Model1, Model2, form=Model2Form, extra=1)
Model2Field3Formset = inlineformset_factory(User, Model2, form=Model2Form, extra=1)

А вот мой views.py:

class NewEntry(CreateView):
    model = Model1
    fields = ['Field1']
    success_url = reverse_lazy('voting:index')

    def get_context_data(self, **kwargs):
        data = super().get_context_data(**kwargs)
        if self.request.POST:
            data['model2_field2'] = Model2Field2Formset(self.request.POST)
            data['model2_field3'] = Model2Field3Formset(self.request.POST)
        else:
            data['model2_field2'] = Model2Field2Formset()
            data['model2_field3'] = Model2Field3Formset()
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        model2_field2 = context['model2_field2']
        model2_field3 = context['model2_field3']
        with transaction.atomic():
            self.object = form.save()
            if model2_field2.is_valid() and model2_field3.is_valid():
                model2_field2.instance = self.object
                model2_field2.save()
                model2_field3.instance = self.object
                model2_field3.save()

        return super().form_valid(form)

Я пытаюсь создать запись для Model1, Field1.Затем, используя inlineformset_factory, создайте несколько email записей в Model2, каждая из которых связана с одной и той же Field1_id записью и соответствующими user_id каждого email в форме.

Но я получаю "Model2.user" must be a "User" instance.ошибка в строке кода model2_field3.save().Если я закомментирую эту строку, ошибок не будет, и записи будут сохранены, как и ожидалось, за исключением столбца Field3, который остается NULL.

. Это трассировка ошибки:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/polls/newpoll/

Django Version: 2.0.5
Python Version: 3.5.2
Installed Applications:
['secvot',
 'accounts.apps.AccountsConfig',
 'voting.apps.VotingConfig',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/home/kostis/.virtualenvs/secvote/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
  35.             response = get_response(request)

File "/home/kostis/.virtualenvs/secvote/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "/home/kostis/.virtualenvs/secvote/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/kostis/.virtualenvs/secvote/lib/python3.5/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)

File "/home/kostis/.virtualenvs/secvote/lib/python3.5/site-packages/django/views/generic/base.py" in dispatch
  89.         return handler(request, *args, **kwargs)

File "/home/kostis/.virtualenvs/secvote/lib/python3.5/site-packages/django/views/generic/edit.py" in post
  172.         return super().post(request, *args, **kwargs)

File "/home/kostis/.virtualenvs/secvote/lib/python3.5/site-packages/django/views/generic/edit.py" in post
  142.             return self.form_valid(form)

File "/home/kostis/PycharmProjects/secvot/voting/views.py" in form_valid
  110.                 eligible_voters_user.save()

File "/home/kostis/.virtualenvs/secvote/lib/python3.5/site-packages/django/forms/models.py" in save
  670.         return self.save_existing_objects(commit) + self.save_new_objects(commit)

File "/home/kostis/.virtualenvs/secvote/lib/python3.5/site-packages/django/forms/models.py" in save_new_objects
  804.             self.new_objects.append(self.save_new(form, commit=commit))

File "/home/kostis/.virtualenvs/secvote/lib/python3.5/site-packages/django/forms/models.py" in save_new
  943.         setattr(form.instance, self.fk.name, self.instance)

File "/home/kostis/.virtualenvs/secvote/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py" in __set__
  197.                     self.field.remote_field.model._meta.object_name,

Exception Type: ValueError at /polls/newpoll/
Exception Value: Cannot assign "<Poll: asdefrgrs>": "EligibleVoters.user" must be a "User" instance.

Просто sidenote, модель EligibleVoters соответствует Model2 в моем вопросе.Я переименовал и удалил несколько полей, чтобы упростить мой вопрос.

Это то, чего я пытаюсь достичь:

enter image description here

В основном модель с двумя внешними ключами (две родительские модели).Создайте одну запись Field1, а затем с помощью inlineformset_factory создайте несколько email записей в Model2, связанных с этой единственной Field1 записью и соответствующими user_id каждой email.

1 Ответ

0 голосов
/ 05 июня 2018

В вашем методе form_valid() вы назначаете одинаковые self.object для model2_field2 и model2_field3, что не может быть правильным, поскольку они являются внешними ключами для разных моделей.Скорее всего, вы пытаетесь назначить экземпляр Model1 на model2_field3, где вы должны назначить экземпляр User для этого поля.

...