为什么我的Django视图在没有数据的情况下显示正确的模型字段?

时间:2016-12-10 20:13:41

标签: python django model modelform django-generic-views

我正在尝试使用Django为我的用户创建用户个人资料。总的来说,它似乎主要工作,我能够在管理页面中看到一切正确。在我的实际HTML页面上,我正确地看到了我需要的模型字段,但是它们没有填充任何数据,而且我输入的数据实际上并不会保存,即使它说的确实存在。

views.py

class DemoUserEditView(UpdateView):
    form_class = DemoUserEditForm
    template_name = "user/profile.html"
    view_name = 'account_profile'
    success_url = '/member/'

    def get_object(self):
        return self.request.user

    def form_valid(self, form):
        form.save()
        messages.add_message(self.request, messages.INFO, 'User profile updated')
        return super(DemoUserEditView, self).form_valid(form)


account_profile = login_required(DemoUserEditView.as_view())

models.py。

class UserProfile(models.Model):

    user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE)
    avatar_url = models.CharField(max_length=256, blank=True, null=True)

    skills = models.CharField(max_length=256, blank=True, null=True)



    avatarpic = models.ImageField(_('avatar photo'),
    blank=True, null=True,
    upload_to=user_directory_path, validators=[validate_img_extension])

    Bio = models.TextField(_('Bio'),
    max_length=200, blank=True, null=True, unique=False)

    EDUCATION_CHOICES = (
    ('0', "Didn't complete High School"),
    ('1', 'High School or GED'),
    ('2', 'Associate Degree'),
    ('3', 'Batchlors Degree'),
    ('4', 'Masters Degree'),
    ('5', 'PhD Degree'),
    ('6', 'Professional Degree'),
    )

    Education = models.CharField(_('Education'),
    max_length=100, blank=True, null=False, 
    choices=EDUCATION_CHOICES, unique=False, 
    help_text="Level of Education")

urls.py

url(r'^accounts/', include('allauth.urls')),
url(r'^accounts/profile/$', 'base.views.account_profile', name='account_profile'),    

我正在尝试使用通用视图,我认为UpdateView将是适当的标记。我已阅读Generic View docs以及多个this stackoverflow问题和this one。我的大问题是我没有收到任何错误消息,它说表格有效并且保存,但它不是,我不确定还有什么可以尝试。

那么如何用现有的用户数据填充我的模型?

1 个答案:

答案 0 :(得分:0)

写成here

  

UpdateView希望显示已填充值的表单,所以它   在处理请求之前实例self.object。这使得   对象字典下的关键字字典中可用的对象,   由modelforms用来初始化数据。

对我而言,这意味着:

def get_object(self):
    return self.request.user

不返回表单所需的User对象。你能请求检查它是否为无?

编辑1:我进行了本地测试,并在覆盖get_form表单数据后加载到表单中:

def get_form(self, form_class=None):

    user = self.request.user
    profile = get_user_profile(self.request.user)
    user_initial = {'username': user.username,
                    'first_name': user.first_name,
                    'last_name': user.last_name,
                    'email': user.email,
                    'phone': profile.phone}

    form = ProfileForm(initial=user_initial, instance=profile)
    return form

正如您在get_form中所看到的,您可以创建表单并提供初始数据和实例。