如何在Django 1.9中使用自定义Heritaged User作为身份验证?

时间:2016-05-23 07:29:54

标签: django django-models django-forms django-views

我在Django中有点新鲜,而且我试图从表单中提取用户信息,当我尝试将表单信息保存到数据库中时会出现问题,因为它获取的用户信息是来自默认用户模型,但正在保存的模型(" Mensaje")与我使用的扩展用户模型(称为" Usuario")具有外键关系,因此当我发动机时引擎失败尝试将表单信息放入模型中。

为了兼容性,我尝试尽可能少地触摸默认选项,但由于大多数问题/答案都已过时,我找不到正确的答案。这是我的代码:

#app/models.py
class Usuario (models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    segundos = models.IntegerField()
    id_ciudad = models.ForeignKey(Ciudad,related_name="Fk1_usuario_ciudad")


    def __str__(self):
        cadenaMinutos = self.user.first_name + ', tiene acumulados ' + str(int(self.segundos/60))
        return cadenaMinutos


class Mensaje (models.Model):
    tit_msj = models.CharField(max_length=100)
    descripcion_msj = models.TextField()
    email = models.EmailField()
    f_msj= models.DateTimeField(default=timezone.now)
    id_usr = models.ForeignKey(Usuario, related_name="Fk1_mensaje_usr")

    def __str__(self):
        return self.tit_msj

令我头疼的观点:

#views.py
def contacto(request):
    if request.method == "POST":
        formulario = FormularioContacto(request.POST)
        if formulario.is_valid():
            mensaje = formulario.save(commit=False)
            if request.user.is_authenticated():
                mensaje.id_usr = request.user
                mensaje.save()
            else:
                mensaje.save()
            return redirect('exchange.views.gracias', correo=mensaje.email)
    else:
        formulario = FormularioContacto()
        return render(request, 'base/contacto.html',{'form' : formulario})

最后是视图使用的表单:

#forms.py
class FormularioContacto(forms.ModelForm):

    class Meta:
        model = Mensaje
        fields = ('tit_msj', 'descripcion_msj', 'email',)

我认为最好的办法是将扩展的用户模型(" Usuario")用于身份验证的模型,但我已经陷入困境。

对于任何有兴趣的人,这里引发错误:

Cannot assign "<SimpleLazyObject: <User: admin>>": "Mensaje.id_usr" must be a "Usuario" instance.

任何帮助将不胜感激,提前谢谢。

1 个答案:

答案 0 :(得分:0)

mensaje.id_usr = request.user更改为mensaje.id_usr = request.user.usuario将解决错误。