2017-10-29 124 views
0

抱歉,如果标题不是那么具有描述性,我不知道该如何表达。 我有两个表格: 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) 

或可能是在视图中添加?在用户注册过程中?

而对于对不起我的英文不好

回答

1

尽量不要使用信号尽可能的,因为它们通过控制反转伤害代码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() 
..... 
+0

感谢您的回答,现在我想试试这个......我需要这个作品尽快 –

1

如果你想添加一个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