【问题标题】:Django: Changing User Profile by formsDjango:通过表单更改用户配置文件
【发布时间】:2011-07-16 18:52:43
【问题描述】:

我正在使用 UserProfile 来保存我创建的一些字段。它工作正常。但我想创建一个新视图让用户更改(更新)这些字段值。但是,这些价值观并没有以形式表现出来。有人知道如何解决吗?

view.py

@login_required

    def atualizar_cadastro_usuario(request):    
        if request.method == 'POST':       
            form = cadastrousuarioForm(request.POST,instance=request.user.get_profile())


            if form.is_valid():            
                new_user = form.save()            
                return render_to_response("registration/cadastro_concluido.html",{})
        else:    
            form = cadastrousuarioForm(request.POST,instance=request.user.get_profile())
        return render_to_response("registration/registration.html", {'form': form})

form.py

class cadastrousuarioForm(UserCreationForm):   
    username = forms.EmailField(label = "Email",widget=forms.TextInput(attrs={'size':'60','maxlength':'75'}))
    email = forms.EmailField(label = "Digite o Email novamente",widget=forms.TextInput(attrs={'size':'60','maxlength':'75'}))
    nome = forms.CharField(label = 'Nome',widget=forms.TextInput(attrs={'size':'30','maxlength':'100'}))
    cpf = BRCPFField(label='CPF')
    data_nascimento=forms.DateField(widget=forms.DateInput(format = '%d/%m/%Y'), input_formats=('%d/%m/%Y',))    
    endereco = forms.CharField(label = 'Endereço',widget=forms.TextInput(attrs={'size':'30','maxlength':'100'}))
    cidade = forms.CharField(label = 'Cidade')
    estado = forms.CharField(widget=BRStateSelect(), label='Estado', initial = 'SP') 
    telefone = forms.CharField(label = "Telefone",widget=forms.TextInput(attrs={'size':'12','maxlength':'12'}))
    escolaridade = forms.ChoiceField(choices=UserProfile.ESCOLARIDADE_ESCOLHAS)    
    profissao = forms.CharField(label = 'Profissão')
    empresa = forms.CharField(label = 'Empresa',required=False) 
    receber_emails = forms.ChoiceField(choices=UserProfile.QUESTIONARIO_ESCOLHAS)     
    #captcha = CaptchaField(label = 'Digite as letras a seguir')

    class Meta:
        model = User
        fields = ("username","email")


    def save(self, commit=True):
        user = super(cadastrousuarioForm, self).save(commit=False)  
... 

在 bash 中,它工作正常:

>>> from django.contrib.auth.models import User
>>> from cadastro.models import UserProfile
>>> u = User.objects.get(username='user@gmail.com')
>>> u.get_profile().telefone
u'123123455'

【问题讨论】:

    标签: django django-authentication django-profiles


    【解决方案1】:

    您需要将表单中的模型从User 更改为UserProfile。该表单还需要继承 ModelForm 而不是 UserCreationForm。此外,您似乎只使用了 ModelForm 中的一部分字段(usernameemail)。最后,由于您使用的是 ModelForm,因此您不需要在表单中定义所有模型的字段。尝试将您的 cadastrousuarioForm 更改为以下内容:

    class cadastrousuarioForm(ModelForm):   
        class Meta:
            model = UserProfile
            fields = ('username','email')
        def save(self, commit=True):
            user = super(cadastrousuarioForm, self).save(commit=False)  
    

    【讨论】:

    • 滚石,效果很好!但我想只显示一些用户配置文件的字段。您提出的解决方案,该模型的所有领域都在展示。你有什么线索吗?
    • 酷,很高兴它成功了!限制字段​​很容易,只需将以下内容添加到您的 Meta 类:fields = ("username","email") 以及您想要包含的所有字段。我更新了答案以反映这一点。
    • 现在,它停止工作了:-P 为 UserProfile 指定的未知字段(用户名、电子邮件)
    • 是的,您必须将usernameemail 替换为您想要使用的字段。
    • 我觉得我完全困了。谢谢你的时间。效果很好。
    猜你喜欢
    • 2021-08-10
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多