我正在尝试使用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。我的大问题是我没有收到任何错误消息,它说表格有效并且保存,但它不是,我不确定还有什么可以尝试。
那么如何用现有的用户数据填充我的模型?
答案 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中所看到的,您可以创建表单并提供初始数据和实例。