扩展Django用户模型并进行注册视图

时间:2012-08-21 22:22:59

标签: django django-models django-views

我正在尝试使用继承来扩展Django中的User模型。这是我的模特:

class Paciente (User):
    Carteira = models.CharField(max_length=50, 
        verbose_name="Num Carteira Plano Saude",unique=True)
    Convenio = models.ForeignKey(Operadora,'Descricao', related_name="convenio", 
        verbose_name="Convenio",unique=True)
    DDD = models.CharField(max_length=2, verbose_name="DDD")
    Telefone = models.CharField(max_length=10, verbose_name="Telefone")

这是我的观点:

def paciente_register(request):
    PacienteFormSet = modelformset_factory(Paciente)

    if request.method == 'POST':
        form = PacienteFormSet(request.POST or None, 
            request.FILES or None, queryset=Paciente.objects.none(), 
            initial=[{
                'is_staff': False,
                'is_active': True, 
                'is_superuser': False, 
                'date_joined': datetime.now(), 
                'last_login': datetime.now()
            }]
        ) #incluir
        if form.is_valid():
            instance = form.save(commit=False) #pre-salva o registro
            for logvalue in instance:  # repoe os valores 'hidden' de log
                logvalue.is_staff = False
                logvalue.is_active = True
                logvalue.is_superuser = False
                logvalue.date_joined = datetime.now()
                logvalue.last_login = datetime.now()
            for reform in instance:  # salva no banco
                reform.save()
        else:
            return HttpResponseRedirect('/erro/')
    else:
        form = PacienteFormSet(queryset=Paciente.objects.none(), 
            initial=[{
                'is_staff':False,
                'is_active': True,
                'is_superuser': False,
                'date_joined': datetime.now(),
                'last_login': datetime.now()
            }]
        ) #incluir
    return render_to_response('register.html', {'form': form,}, context_instance=RequestContext(request))

最后但并非最不重要的是,我的模板:

<form enctype="multipart/form-data" method="POST" action="/paciente_register/" >{% csrf_token %}
{{ form.management_form }}
   {% for formy in form.forms %}
      {{ formy.username.label_tag}}:{{formy.username}}<br>
      {{ formy.password.label_tag}}:{{formy.password}}<br>
      {{ formy.Carteira.label_tag}}:{{formy.Carteira}}<br>
      {{ formy.Convenio.label_tag}}:{{formy.Convenio}}<br>
      {{ formy.DDD.label_tag}}:{{formy.DDD}}<br>
      {{ formy.Telefone.label_tag}}:{{formy.Telefone}}<br>
      {{formy.is_staff.as_hidden}}
      {{formy.is_active.as_hidden}}
      {{formy.is_superuser.as_hidden}} 
      {{formy.date_joined.as_hidden}}
      {{formy.last_login.as_hidden}}

    {% endfor %}   
    <input type="submit" name="submit" value="Salvar" />
</form>

用户应该自己注册,但他只能访问编辑某些字段,因为我在视图和模板中设置的其他字段,我隐藏了它们。

但问题是我的表格没有验证。我做了很多研究,但是在互联网上只有几个例子使用继承来扩展User模型。而这些,并未显示如何在应用程序内部注册用户。

任何帮助都将非常感谢! :)

2 个答案:

答案 0 :(得分:0)

毕竟问题在于观点。我强迫字段“date_joined”和“last_login”接收datetime.now(),因为我正在关注Django管理模板。遗憾的是,这不正确,每当我尝试添加用户时,它都会跳转到错误模板,这意味着表单未正确填充。解决方案是让这些字段接收date.today(),现在它可以正常工作。

我认为这种模型继承仍然不能很好地工作(Python 2.7和Django 1.3)。当您在模型中使用它时,请确保Django在您的数据库中创建了哪种字段,这将为您节省很多麻烦。

答案 1 :(得分:0)

总的来说,我认为模型继承工作正常,没有重大问题。 关于用户模型,我没有太多的经验,但也许你的问题是因为你没有像Django那样提出这个问题?

以防万一你的内容,一些更有趣的帖子:h