我已經在我的註冊頁面上創建了一個擴展用戶模型。這兩個定製模型是「克里斯汀」和一個名爲「Rolle」的多對多字段(該組織的角色)。ValueError:「需要在此多對多關係可以使用之前爲字段」id「設置一個值」
後我加入了很多對多場,我收到以下錯誤信息:ValueError異常在/帳號/註冊/ - 「Userextended:username_that_I_registered_with」需要有場「ID」的值,在此之前可以使用多對多的關係。
我已經搜索了三個小時了,看起來解決方法是在保存模型之前在用戶ID上使用commit = False。但是,我對Django和Python很陌生,並且無法準確指出我應該在哪裏編寫代碼,而且我的嘗試迄今未成功。如果您可以幫助我解決這個問題,請通過代碼提供解決方案。
我models.py文件:
class User(auth.models.User,auth.models.PermissionsMixin):
def __str__(self):
return "@{}".format(self.username)
class Personrolle(models.Model):
id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
persrolle = models.CharField(max_length = 30, verbose_name="Role")
def __str__(self):
return self.persrolle
class Userextended(models.Model):
id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
user = models.OneToOneField(User, on_delete=models.CASCADE)
cristin = models.IntegerField(blank=True, null=True)
rolle = models.ManyToManyField(Personrolle)
def __str__(self):
return self.user.username
...
我forms.py文件:
...
from django import forms
from django.contrib.auth.models import User
from accounts.models import Userextended
from accounts.models import Personrolle
from django.contrib.auth.forms import UserCreationForm
class UserCreateForm(UserCreationForm):
cristin = forms.IntegerField(required=False)
rolle = forms.ModelChoiceField(queryset=Personrolle.objects.all())
class Meta():
fields = ('first_name','last_name','username','email','password1','password2')
model = User
labels = {'username': 'Email',
'first_name': 'First name',
'last_name': 'Last name',
'email': 'Confirm email',
'password1': 'Password',
'password2': 'Confirm password',
'cristin': 'Cristin-ID',
'rolle': 'Rolle'}
def save(self, commit=True):
if not commit:
raise NotImplementedError("Can't create User and Userextended without database save")
user = super(UserCreateForm, self).save(commit=True)
user_profile = Userextended(user=user,cristin=self.cleaned_data['cristin'],rolle=self.cleaned_data['rolle'])
user_profile.save()
return user
...
錯誤的更詳細描述
- 請求方法:POST
- 請求URL:http://127.0.0.1:8000/accounts/signup/
- Django的版本:1.11.2
- 異常類型:ValueError異常
異常值: 「Userextended:username_that_I_registered_with」 之前需要有現場 「ID」 的值這種多對多的關係可以被使用。
異常位置:... /蟒蛇/ ENVS/myEnv/lib中/ python3.6 /站點包/ Django的/ DB /模型/場/在初始化 related_descriptors.py,線830
Python的可執行文件:... /蟒蛇/ ENVS/myEnv /斌/ Python的
- Python版本:3.6.1
我回溯:
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/views/generic/base.py" in view
68. return self.dispatch(request, *args, **kwargs)
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/views/generic/base.py" in dispatch
88. return handler(request, *args, **kwargs)
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/views/generic/edit.py" in post
217. return super(BaseCreateView, self).post(request, *args, **kwargs)
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/views/generic/edit.py" in post
183. return self.form_valid(form)
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/views/generic/edit.py" in form_valid
162. self.object = form.save()
File "…PROJECT/accounts/forms.py" in save
57. user_profile = Userextended(user=user,cristin=self.cleaned_data['cristin'],rolle=self.cleaned_data['rolle'])
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/db/models/base.py" in __init__
566. _setattr(self, prop, kwargs[prop])
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py" in __set__
536. manager = self.__get__(instance)
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py" in __get__
513. return self.related_manager_cls(instance)
File ".../anaconda/envs/myEnv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py" in __init__
830. (instance, self.pk_field_names[self.source_field_name]))
Exception Type: ValueError at /accounts/signup/
Exception Value: "<Userextended: [email protected]>" needs to have a value for field "id" before this many-to-many relationship can be used.