Django:如何使用“code”和pre_save信号注册用户
问题描述:
抱歉,如果标题不是那么具有描述性,我不知道该如何表达。 我有两个表格: 1.-包含代码字段和另一个“is_taken”字段的“Matricula”表格处于“False”状态。2.“User”表格和注册新用户时必须插入如果代码存在,然后“is_taken”将是“真”,并允许用户注册,我的问题是......我该怎么做?,哪种方式将是最好的?Django:如何使用“code”和pre_save信号注册用户
我正在处理“pre_save”信号,但没有成功。
models.py
class Matricula(models.Model):
code = models.CharField(max_length=9, blank=True)
is_taken = models.BooleanField("¿Esta ocupado?", default=False)
created_at = models.DateTimeField("Fecha de creación", auto_now_add = True)
updated_at = models.DateTimeField("Fecha de actualización", auto_now = True)
def __str__(self):
return "%s" %(self.matricula)
class User(auth_models.AbstractBaseUser, auth_models.PermissionsMixin):
code = models.CharField("Matricula", max_length=9, blank=True)
email = models.CharField("Correo Electrónico", max_length=100, blank=True, unique=True)
first_name = models.CharField("Nombre(s)", max_length=60, blank=True)
last_name = models.CharField("Apellidos", max_length=60, blank=True)
is_staff = models.BooleanField("¿Es Staff?", default=False, blank=True)
is_active = models.BooleanField("¿Es Activo?", default=False, blank=True)
date_joined = models.DateTimeField("Fecha de registro", auto_now_add=True)
或可能是在视图中添加?在用户注册过程中?
而对于对不起我的英文不好
答
尽量不要使用信号尽可能的,因为它们通过控制反转伤害代码readabilty。
正如我理解您的问题,您不希望没有邀请码的人“Matricula”能够在您的网站上注册。你最好在你的报名表上填写。也许这样的事情:
class UserRegistrationForm(AuthRegistrationForm):
code = forms.CharField(max_length=9)
def clean(self):
cleaned_data = super(ContactForm, self).clean()
try:
matricula = Matricula.objects.get(code=cleaned_data.get('code', None), is_taken=False)
except ObjectDoesNotExist:
raise forms.ValidationError('Invalid code')
else:
cleaned_data['code'] = matricula
return cleaned_data
# in your views:
.... if form.is_valid():
matricula = form.cleaned_data['code']
matricula.is_taken = True
matricula.save()
new_user = form.save()
.....
答
如果你想添加一个matricula
为每个用户,你应该使用的关系,而不是一个CharField,假设每个User
只有一个matricula
使用OneToOneField
:
class User(auth_models.AbstractBaseUser, auth_models.PermissionsMixin):
matricula = models.OneToOneField(Matricula)
那么这个部分很简单,当你创建视图时问题就来了,所以如果你根据关系创建你的模型,Django将显示现有的matricula
对象,所以在你的模型中排除这个字段并在视图中添加模型的母亲icula对象,以便您可以创建并保存它。
def add_and_create_matricula(request):
if request.method = 'POST':
form_user = ModelForm_user(request.POST)
form_matricula = ModelForm_matricula(request.POST)
if form_user.is_valid and form_matricula.is_valid():
matricula = form_matricula.save()
user = form_user.save(commit=False)
user.matricula = matricula # Here we add the realtion to the matricula
user.save() # And save the relation
form_user = ModelForm_user()
form_matricula = ModelForm_matricula()
return render(request, your_template.html, {'form_user':form_user, 'form_matricula':form_matricula})
这里,我离开你举个例子,你应该如何matricula
对象店内user
感谢您的回答,现在我想试试这个......我需要这个作品尽快 –