Django编辑用户个人资料

man*_*sim 13 django profile edit

我正在尝试在前面创建一个"编辑配置文件"表单.会发生什么是我的表单(我不是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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

pat*_*eet 17

你很近.在实例化表单时,需要将User要修改的对象作为instance参数传递.

来自文档:

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

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

form = UpdateProfile(request.POST, instance=request.user)
if form.is_valid():
    ...
Run Code Online (Sandbox Code Playgroud)

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


Kho*_*Phi 5

或者,如果您想使用UpdateView,可以使用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'
Run Code Online (Sandbox Code Playgroud)

你在models.py中为MyProfile提供类似的东西:

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

和你的urls.py一样(假设你正在使用django allauth并想要尊重网址约定):

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

剩下的就是Django的乐趣!如果你能用于基本的CRUD任务,我会建议你写更少的代码,除非它真的需要做一些自定义的事情,甚至你仍然可以通过扩展基于类的视图来逃避.

如果您需要更多信息,请参阅此处:基于类视图的Django文档