【问题标题】:Django edit user profileDjango 编辑用户配置文件
【发布时间】:2014-04-29 07:49:00
【问题描述】:

我正在尝试在前端创建一个“编辑个人资料”表单。发生的情况是我的表单(我不是 100% 确定)尝试创建用户而不是查找当前用户并更新他的个人资料。所以我认为这就是问题所在。在这里检查了很多问题,但没有一个足够清楚。我要编辑的字段是电子邮件、名字和姓氏。 (另外我想加个uda

forms.py

class UpdateProfile(forms.ModelForm):
    username = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    first_name = forms.CharField(required=False)
    last_name = forms.CharField(required=False)

    class Meta:
        model = User
        fields = ('username', 'email', 'first_name', 'last_name')

    def clean_email(self):
        username = self.cleaned_data.get('username')
        email = self.cleaned_data.get('email')

        if email and User.objects.filter(email=email).exclude(username=username).count():
            raise forms.ValidationError('This email address is already in use. Please supply a different email address.')
        return email

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.email = self.cleaned_data['email']

        if commit:
            user.save()

        return user

views.py

def update_profile(request):
    args = {}

    if request.method == 'POST':
        form = UpdateProfile(request.POST)
        form.actual_user = request.user
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('update_profile_success'))
    else:
        form = UpdateProfile()

    args['form'] = form
    return render(request, 'registration/update_profile.html', args)

【问题讨论】:

    标签: django edit profile


    【解决方案1】:

    你很亲密。当您实例化表单时,您需要将您正在修改的User 对象作为instance 参数传递。

    来自文档:

    ModelForm 的子类可以接受现有模型实例作为 关键字参数instance;如果提供,save() 将更新 那个实例。

    在您的代码中,它看起来像:

    form = UpdateProfile(request.POST, instance=request.user)
    if form.is_valid():
        ...
    

    您可以在此处查看更多信息:https://docs.djangoproject.com/en/1.6/topics/forms/modelforms/#the-save-method

    【讨论】:

    • 也许在这种情况下,来自 ClassBased Views 的 UpdateView 会容易得多。
    【解决方案2】:

    或者,如果您想采用基于类的视图方式,使用 UpdateView,您可以在 views.py 中执行类似的操作:

    class UpdateProfile(UpdateView):
        model = MyProfile
        fields = ['first_name', 'last_name', 'image', 'url', 'biography', '...'] # Keep listing whatever fields 
        # the combined UserProfile and User exposes.
        template_name = 'user_update.html'
        slug_field = 'username'
        slug_url_kwarg = 'slug'
    

    models.py 中的 MyProfile 有这样的内容:

    class MyProfile(AbstractUser):
        image = models.ImageField(upload_to='uploads/profile/')
        url = models.URLField()
        biography = models.CharField(max_length=1000)
    

    和你的 urls.py 一样(假设你正在使用 django allauth 并且想要遵守 url 约定):

    ....
    url(r'^accounts/update/(?P<slug>[\-\w]+)/$', views.UpdateProfile.as_view(), name='update_user'),
    ....
    

    剩下的就是 Django 的乐趣!如果你可以为基本的 CRUD 任务编写更少的代码,我会建议你编写更少的代码,除非确实需要做一些自定义的事情,即使你仍然可以通过扩展基于类的视图来摆脱这些。

    如果您想了解更多信息,请参阅此处:Django Docs on Class Based Views

    【讨论】:

    • 我知道这已经回答了一段时间,但如果你能解释一下 slug 那就太好了。顺便说一句,答案很好。
    • @almostabeginner 也许这会有所帮助:stackoverflow.com/questions/427102/what-is-a-slug-in-django
    • 我实际上已经阅读过,我了解 slug 是什么,但我不明白它在您的方法中是如何工作的。我希望它通过您的方法实现相同的目标,但不断出错。我会发布对我有用的内容。
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2014-06-17
    相关资源
    最近更新 更多