2017-06-28 42 views
0

我已經在我的註冊頁面上創建了一個擴展用戶模型。這兩個定製模型是「克里斯汀」和一個名爲「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. 

回答

0

發生錯誤信息是因爲「rolle」應該指定爲多對一關係而不是多對多關係。該型號已更新至以下版本,現在可以完美工作:

class Userextended(models.Model): 
    ... 
    rolle = models.ForeignKey(Personrolle, models.SET_NULL, blank=True, null=True) 
0

你只需要編輯您的保存方法在你的形式,

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']) 
    user_profile.save() 
    user_profile.rolle.add(self.cleaned_data['rolle']) 
    user_profile.save() 
    return user 

您需要先保存UserExtended模式,那麼Rolle實例添加到多對多的關係。

相關問題