Django更改表单不起作用

2024-07-03 07:04:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Django网站有些问题。我想建立一个电子商务。我有一个自定义的用户模型,有一些我需要的字段(比如地址、电子邮件等)。代码如下:

class UsuarioFunnaticos(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True, db_index=True)
    USERNAME_FIELD = "email"

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    nome_completo = models.CharField(max_length=255)
    cep_entrega_cliente = models.CharField(max_length=9)
    rua_entrega_cliente = models.CharField(max_length=100)
    bairro_entrega_cliente = models.CharField(max_length=100)
    numero_entrega_cliente = models.CharField(max_length=10)
    complemento_entrega_cliente = models.CharField(max_length=20, blank=True)

    ACRE = 'AC'
    ALAGOAS = 'AL'

    # Some other choices

    SERGIPE = 'SE'
    TOCANTINS = 'TO' 

    ESTADOS = (
    (ACRE, 'Acre'),
    (ALAGOAS, 'Alagoas'),
    (AMAPA, 'Amapa'),
    (AMAZONAS, 'Amazonas'),
    (BAHIA,'Bahia'),
    (CEARA,'Ceara'),
    (DISTRITO_FEDERAL,'Distrito Federal'),
    (ESPIRITO_SANTO,'Espirito Santo'),
    (GOIAS,'Goias'),
    (MARANHAO,'Maranhao'),
    (MATO_GROSSO,'Mato Grosso'),
    (MATO_GROSSO_DO_SUL,'Mato Grosso do Sul'),
    (MINAS_GERAIS,'Minas Gerais'),
    (PARA,'Para'),
    (PARAIBA,'Paraiba'),
    (PARANA,'Parana'),
    (PERNAMBUCO,'Pernambuco'),
    (PIAUI,'Piaui'),
    (RIO_DE_JANEIRO,'Rio de Janeiro'),
    (RIO_GRANDE_DO_NORTE,'Rio Grande Do Norte'),
    (RIO_GRANDE_DO_SUL,'Rio Grande Do Sul'),
    (RONDONIA,'Rondonia'),
    (RORAIMA,'Roraima'),
    (SANTA_CATARINA,'Santa Catarina'),
    (SAO_PAULO,'Sao Paulo'),
    (SERGIPE,'Sergipe'),
    (TOCANTINS,'Tocantins'),        
    )

    estado_entrega_cliente = models.CharField(max_length=30, choices=ESTADOS)
    cidade_entrega_cliente = models.CharField(max_length=90)
    telefone = models.CharField(max_length=20)

    objects = UsuarioFunnaticosManager()

    def get_full_name(self):
        return self.nome_completo

    def get_short_name(self):
        return self.nome_completo

    def __unicode__(self):
        return self.email

在管理上,我有一个usuariofunnationicoschangeform,它在Django管理上运行得非常好。其代码为:

class UsuarioFunnaticosChangeForm(forms.ModelForm):
    password = ReadOnlyPasswordHashField()

    class Meta:
        model = UsuarioFunnaticos

    def clean_password(self):
        return self.initial["password"]

现在我正在尝试建立一个地方,用户可以去改变他们的用户信息,如果他们想改变他们的注册地址,电话等。我的看法如下:

def alterar_dados(request):
    if request.method == 'POST':        
        form_edicao = UsuarioFunnaticosChangeForm(request.POST)
        if form_edicao.is_valid():
            usuario = UsuarioFunnaticos.objects.get(email=user.request.email)
            usuario.nome_completo = form_edicao.cleaned_data['nome_completo']
            usuario.rua_entrega_cliente = form_edicao.cleaned_data['rua_entrega_cliente']
            usuario.bairro_entrega_cliente = form_edicao.cleaned_data['bairro_entrega_cliente']
            usuario.numero_entrega_cliente = form_edicao.cleaned_data['numero_entrega_cliente']
            usuario.complemento_entrega_cliente = form_edicao.cleaned_data['complemento_entrega_cliente']
            usuario.estado_entrega_cliente = form_edicao.cleaned_data['estado_entrega_cliente']
            usuario.cidade_entrega_cliente = form_edicao.cleaned_data['cidade_entrega_cliente']
            usuario.telefone = form_edicao.cleaned_data['telefone']
            usuario.save()
            return HttpResponseRedirect('/conta')        
    else:        
        form_edicao = UsuarioFunnaticosChangeForm()        
    return render_to_response('conta_cliente/alterar_dados.html', { 'form_edicao': form_edicao }, context_instance = RequestContext(request))

我也试过了_保存(),但两者都返回以下错误:

KeyError at /conta/alterardados/

'password'

我不希望我的用户再次输入他们的密码来更改他们的用户信息,因为他们只有在已经登录的情况下才能访问网站的这一部分。有人能帮忙吗?你知道吗


Tags: 用户selfformdatareturnmodelsemaillength
1条回答
网友
1楼 · 发布于 2024-07-03 07:04:31

嗯,在实例化表单时,应该将现有的用户对象作为instance参数传递。你知道吗

但我不明白为什么要乱搞密码。如果不希望password字段出现在表单上,只需将其添加到表单元类中的exclude列表中。你知道吗

相关问题 更多 >