如何解决django onetoonefield错误前键
我正在做一个django项目。我有2个模型AccountUser和Club,其中club与AccountUser具有一对一的关系。问题是: 当我用AccountUser“ club1”登录并尝试在表Club中创建俱乐部记录(因此用户字段设置为club1的俱乐部记录)时,django将admin置于该字段用户中,我不知道为什么
模型文件
class AccountUser(AbstractUser):
# email = models.EmailField(_('email address'),unique=True)
AbstractUser._meta.get_field('email')._unique = True
first_name = models.CharField(max_length=50)
middle_name = models.CharField(max_length=50,null=True,blank=True)
last_name = models.CharField(max_length=50)
terms_of_service_acceptance = models.BooleanField(default=False)
terms_of_service_acceptance_datetime = models.DateTimeField(auto_now_add=True)
is_club = models.BooleanField(default=False)
REQUIRED_FIELDS = ['email']
USERNAME_FIELD = 'username'
class Meta:
verbose_name = _('Account')
verbose_name_plural = _('Accounts')
@property
def has_profile(self):
try:
assert self.profile
return True
except ObjectDoesNotExist:
return False
def clean(self):
if not self.terms_of_service_acceptance:
raise ValidationError(_("You must accept the terms of service"))
class Club(models.Model):
club_name = models.CharField(max_length=50,unique=True)
street = models.CharField(max_length=150)
civic_number = models.CharField(max_length=5,null=False,blank=False)
city = models.CharField(max_length=50)
zip_code = models.CharField(max_length=5)
user = models.OneToOneField(
AccountUser,on_delete=models.CASCADE,related_name='club',primary_key=True
)
class Meta:
verbose_name_plural = 'Clubs'
ordering = ['-club_name','city']
unique_together = ('street','civic_number','city')
def clean(self):
if len(self.zip_code) != 5 or not self.zip_code.isdigit():
raise ValidationError(_("Il CAP inserito non è valido"))
if not self.civic_number.isdigit():
raise ValidationError(_("Numero civico non valido"))
def save(self,*args,**kwargs):
super().save(*args,**kwargs)
表单文件
class AccountClubCreationForm(UserCreationForm):
helper = FormHelper()
helper.add_input(
Submit('submit','Register',css_class="btn btn-success")
)
helper.form_method = 'POST'
def __init_(self,**kwargs):
super().__init__(*args,**kwargs)
self.fields['username'].widget.attrs['placeholder'] = 'username'
self.fields['email'].widget.attrs['placeholder'] = 'example@example.com'
self.fields['password1'].widget.attrs['placeholder'] = 'choose your password wisely'
self.fields['password2'].widget.attrs['placeholder'] = 'ripeta la password inserita'
def save(self,commit=True):
user = super().save(commit=False)
user.is_club = True
if commit:
user.save()
return user
class Meta:
model = AccountUser
fields = (
'username','email','password1','password2','first_name','middle_name','last_name','terms_of_service_acceptance',)
class ClubCreationForm(forms.ModelForm):
helper = FormHelper()
helper.add_input(
Submit('submit',css_class='btn btn-success')
)
def __init_(self,**kwargs)
self.fields['club_name'].widget.attrs['placeholder'] = 'Nome del centro sportivo'
self.fields['city'].widget.attrs['placeholder'] = 'Città'
class Meta:
model = Club
fields = (
'club_name','street','city','zip_code'
)
class SubmitButtonMixin(forms.ModelForm):
def __init__(self,**kwargs)
if self.instance.id:
self.helper.inputs[0].value = 'Update'
self.helper.inputs[0].field_classes = 'btn btn-warning'
else:
self.helper.inputs[0].value = 'Create'
self.helper.inputs[0].field_classes = 'btn btn-success'
视图文件
class AccountClubCreateView(CreateView):
form_class = AccountClubCreationForm
template_name = 'registration/account_club_create_crispy.html'
success_url = reverse_lazy('user_mgmt:homepage')
def form_valid(self,form):
response = super(AccountClubCreateView,self).form_valid(form)
mail_subject = _('Sporting: Conferma account centro sportivo')
relative_confirm_url = reverse(
'user_mgmt:verify-account-email',args=[
urlsafe_base64_encode(force_bytes(self.object.pk)),account_activation_token.make_token(self.object)
]
)
self.object.email_user(
subject=mail_subject,message=f'''Ciao {self.object.username},e benvenuto sul nostro sito!
Clicca il link seguente per confermare il tuo account:
{self.request.build_absolute_uri(relative_confirm_url)}
A presto,Sporting'''
)
self.object.token_sent = True
# self.object.is_active = False # Se voglio che prima l'utente confermi la mail
self.object.save()
login(self.request,self.object)
return response
class ClubCreateView(CreateView):
model = Club
form_class = ClubCreationForm
template_name = 'creation/create_club_crispy.html'
success_url = reverse_lazy('user_mgmt:homepage')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。