7

我有两个可能相关的 UpdateView 问题。首先,它不是更新用户,而是创建一个新的用户对象。其次,我不能限制表单中显示的字段。

这是我的views.py:

class RegistrationView(FormView):
    form_class = RegistrationForm 
    template_name = "register.html"
    success_url = "/accounts/profile/" 

    def form_valid(self, form):
        if form.is_valid:
            user = form.save() 
            user = authenticate(username=user.username, password=form.cleaned_data['password1'])
            login(self.request, user)
            return super(RegistrationView, self).form_valid(form) #I still have no idea what this is

class UserUpdate(UpdateView):
    model = User
    form_class = RegistrationForm
    fields = ['username', 'first_name']
    template_name = "update.html"
    success_url = "/accounts/profile/" 

和 urls.py

url(r'^create/$', RegistrationView.as_view(), name="create-user"), 
url(r'^profile/(?P<pk>\d+)/edit/$', UserUpdate.as_view(), name="user-update"), 

如何正确使用 UpdateView?

4

3 回答 3

8

问题 1. 用户没有被更新,因为您使用相同的表单 (RegistrationForm) 进行更新并创建新用户。

问题 2. 表单属于它们自己的名为 forms.py 的文件。我建议的重构:



    #forms.py
    #place(forms.py) this in the same directory as views.py

    class UpdateForm(forms.ModelForm):
    #form for updating users
    #the field you want to use should already be defined in the model
    #so no need to add them here again DRY
        class Meta:
            model = User
            fields = ('field1', 'field2', 'field3',)

    #views.py
    #import your forms
    from .forms import UpdateForm
    #also import your CBVs
    from django.views.generic import UpdateView

    class UserUpdate(UpdateView):  
        context_object_name = 'variable_used_in `update.html`'
        form_class = UpdateForm
        template_name = 'update.html'
        success_url = 'success_url'

        #get object
        def get_object(self, queryset=None): 
            return self.request.user

        #override form_valid method
        def form_valid(self, form):
            #save cleaned post data
            clean = form.cleaned_data 
            context = {}        
            self.object = context.save(clean) 
            return super(UserUpdate, self).form_valid(form)    

略优雅的 urls.py



    #urls.py
    #i'm assuming login is required to perform edit function
    #in that case, we don't need to pass the 'id' in the url. 
    #we can just get the user instance
    url(
        regex=r'^profile/edit$',
        view= UserUpdate.as_view(),
        name='user-update'
    ),

您遗漏了很多信息,因此不确定您的设置是什么。我的解决方案基于您拥有 Django 1.5 的假设。您可以了解有关使用 CBV 处理表单的更多信息

于 2013-08-07T03:26:35.267 回答
2

首先user = form.save()将表格保存在db中。因为形式中没有 pk,所以它会创建一个新的。您要做的可能是检查具有该用户名的用户是否存在,如果不创建它(这部分检查谷歌)。

第二:要限制字段,您必须在Meta表单的类中指定它们(您没有在此处显示)检查此https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#modelform

于 2013-08-01T09:05:27.413 回答
2

如果您在数据库中获取新对象而不是更新现有对象,则很可能您复制并粘贴了新对象的模板而忘记更改表单的操作属性。这应该指出,更新是以硬编码路径或 URL 标记 ( {% url '<name of URLconf>' object.id %) 的形式进行的。

于 2015-08-11T07:39:25.853 回答