Django - 提交表单时无法获得模型选择 FK



我有一个自定义表单注册,引用了一个"类别";模型上的模型ChoiceField。当我试图提交它时,它无法获得对模型的引用,并引发以下错误:

在/markety/signsupplier上的IntegrityError/列中的空值";category_ id";违反非null约束详细信息:失败的行包含(55,,null(

就好像它丢失了所有发布的数据,但我可以在调试中看到category_id在POST数据中传递得很好。

这是我的型号.py:

class Supplier(models.Model):
phone_regex     = RegexValidator(regex=r'^(87|89)d{6}$', message="Entrez un numéro de portable Polynésien valide")
user            = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
enseigne        = models.CharField(max_length=128, blank=False, null=False)
vini            = models.CharField(verbose_name="Vini",validators=[phone_regex], max_length=8, blank=False, null=False)
numero_tahiti   = models.CharField(max_length=9, blank=False, null=False)
immat_rcs       = models.CharField(max_length=9, blank=False, null=False)
categorie       = models.ForeignKey(Categorie, on_delete=models.DO_NOTHING)
labels          = models.CharField(max_length=128)

我的表格.py:

class SignupSupplierForm(UserCreationForm):
email           = forms.EmailField(required=True)
first_name      = forms.CharField(required=True,label="Prenom")
last_name       = forms.CharField(required=True,label="Nom")
vini            = forms.CharField(required=True, max_length=8,validators=[phone_regex])
enseigne        = forms.CharField(required=True, max_length=128, label="Enseigne")
numero_tahiti   = forms.CharField(required=True, max_length=9, label="Numéro Tahiti")
immat_rcs       = forms.CharField(required=True, max_length=9, label="Immatriculation RCS")
categorie       = forms.ModelChoiceField(required=False,queryset=Categorie.objects.all())
labels          = forms.CharField(required=False,max_length=128, label="Labels (option)")
class Meta(UserCreationForm.Meta):
model = User
fields = ('email','first_name','last_name')
@transaction.atomic
def save(self):
user = super().save(commit=False)
user.is_supplier = True
user.save()
supplier = Supplier.objects.create(user=user)
supplier.vini = self.cleaned_data.get('vini')
supplier.enseigne = self.cleaned_data.get('enseigne')
supplier.numero_tahiti = self.cleaned_data.get('numero_tahiti')
supplier.immat_rcs = self.cleaned_data.get('immat_rcs')
supplier.categorie = self.cleaned_data['categorie'].id
supplier.labels = self.cleaned_data.get('labels')
supplier.save()
return user

和视图.py

class SignupSupplierView(CreateView):
model           = User
form_class      = SignupSupplierForm
success_url     = reverse_lazy('home')
template_name   = 'signup.html'
def get_context_data(self, **kwargs):
return super().get_context_data(**kwargs)
def form_valid(self, form):
user = form.save()
login(self.request, user)
return HttpResponseRedirect(self.success_url)

我知道这是";类别";字段,但不知道如何使ot工作。

按照要求,以下是调试面板中POST数据的内容:

Variable             Value
csrfmiddlewaretoken  'TGTAW...qn17h'
email                'testfour@test.com'
first_name           'pre four'
last_name            'nom four'
password1            'test456'
password2            'test456'
vini                 '87740921'
enseigne             'ens four'
numero_tahiti        '123456789'
immat_rcs            '123456789'
categorie            '2'
labels      'test'

我还使用了日志记录功能来获得更多关于错误的信息,我得到了这个。也许它可以帮助:

(0.001) DECLARE "_django_curs_139721501058880_sync_1" NO SCROLL CURSOR WITH HOLD FOR SELECT "ELIEN_CORE_categorie"."id", "ELIEN_CORE_categorie"."categorie", "ELIEN_CORE_categorie"."timestamp", "ELIEN_CORE_categorie"."updated" FROM "ELIEN_CORE_categorie"; args=()
Exception while resolving variable 'object_list' in template 'signup.html'.

然后,再进一步:

Traceback (most recent call last):
File "/home/max/elien_dev/elien/lib/python3.8/site-packages/django/template/base.py", line 848, in _resolve_lookup
raise VariableDoesNotExist("Failed lookup for key "
django.template.base.VariableDoesNotExist: Failed lookup for key [mapbox_key] in [{'True': True, 'False': False, 'None': None}, {'csrf_token': <SimpleLazyObject: '96lE9Cepu2rqn5MbTGqtqmLdsz0LY1dGodSUIsOlqhU1bMj78EZzmLryqI8o7bkU'>, 'request': <WSGIRequest: GET '/marketplace/signsupplier/'>, 'user': <SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x7f1cee9b9850>>, 'perms': <django.contrib.auth.context_processors.PermWrapper object at 0x7f1cee92d580>, 'messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x7f1ceea002e0>, 'DEFAULT_MESSAGE_LEVELS': {'DEBUG': 10, 'INFO': 20, 'SUCCESS': 25, 'WARNING': 30, 'ERROR': 40}}, {}, {'form': <SignupSupplierForm bound=False, valid=False, fields=(email;first_name;last_name;password1;password2;vini;enseigne;numero_tahiti;immat_rcs;categorie;labels)>, 'view': <ELIEN_MARKETPLACE.views.SignupSupplierView object at 0x7f1ceea00370>}, {}]
(0.001) SELECT "ELIEN_CORE_categorie"."id", "ELIEN_CORE_categorie"."categorie", "ELIEN_CORE_categorie"."timestamp", "ELIEN_CORE_categorie"."updated" FROM "ELIEN_CORE_categorie" WHERE "ELIEN_CORE_categorie"."id" = 3 LIMIT 21; args=(3,)
(0.001) SELECT (1) AS "a" FROM "ELIEN_CORE_user" WHERE "ELIEN_CORE_user"."email" = 'testfour@test.com' LIMIT 1; args=('testfour@test.com',)
(0.001) INSERT INTO "ELIEN_CORE_user" ("password", "last_login", "is_superuser", "first_name", "last_name", "is_staff", "is_active", "date_joined", "email", "email_confirmed", "is_client", "is_supplier") VALUES ('p...w=', NULL, false, 'pre four', 'nom four', false, true, '2020-12-08T07:04:56.897584+00:00'::timestamptz, 'testfour@test.com', false, false, true) RETURNING "ELIEN_CORE_user"."id"; args=('p...=', None, False, 'pre four', 'nom four', False, True, datetime.datetime(2020, 12, 8, 7, 4, 56, 897584, tzinfo=<UTC>), 'testfour@test.com', False, False, True)
(0.001) INSERT INTO "ELIEN_MARKETPLACE_supplier" ("user_id", "enseigne", "vini", "numero_tahiti", "immat_rcs", "categorie_id", "labels") VALUES (63, '', '', '', '', NULL, ''); args=(63, '', '', '', '', None, '')
(0.000) SELECT "ELIEN_MARKETPLACE_supplier"."user_id", "ELIEN_MARKETPLACE_supplier"."enseigne", "ELIEN_MARKETPLACE_supplier"."vini", "ELIEN_MARKETPLACE_supplier"."numero_tahiti", "ELIEN_MARKETPLACE_supplier"."immat_rcs", "ELIEN_MARKETPLACE_supplier"."categorie_id", "ELIEN_MARKETPLACE_supplier"."labels" FROM "ELIEN_MARKETPLACE_supplier" LIMIT 21; args=()
(0.000) SELECT "ELIEN_MARKETPLACE_supplier"."user_id", "ELIEN_MARKETPLACE_supplier"."enseigne", "ELIEN_MARKETPLACE_supplier"."vini", "ELIEN_MARKETPLACE_supplier"."numero_tahiti", "ELIEN_MARKETPLACE_supplier"."immat_rcs", "ELIEN_MARKETPLACE_supplier"."categorie_id", "ELIEN_MARKETPLACE_supplier"."labels" FROM "ELIEN_MARKETPLACE_supplier" LIMIT 21; args=()
Internal Server Error: /marketplace/signsupplier/
Traceback (most recent call last):
File "/home/max/elien_dev/elien/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
psycopg2.errors.NotNullViolation: null value in column "categorie_id" violates not-null constraint
DETAIL:  Failing row contains (63, , , , , , null).

谢谢你的帮助!

这是问题,

supplier.categorie = self.cleaned_data['categorie'].id

self.cleaned_data[‘categorie’]本身包含categorie实例的id,因此不需要进行

supplier.categorie = self.cleaned_data['categorie'].id

supplier.categorie = self.cleaned_data['categorie']

最新更新