Django 1.4创建编辑用户配置文件帐户设置视图

时间:2012-05-15 19:08:27

标签: django django-models django-forms

一些背景, 我一直在为Django数据库系统设计一个用户配置文件,我目前正在尝试创建一个视图页面,允许用户编辑他们的帐户设置(在管理页面之外)。我搜索了很多来源,其中大部分都建议使用.get_profile(),但是无论我尝试什么方法(根据我的知识和研究完成),这在我的程序中都没有用。到目前为止,我已经使用.get_profile()的django主页来查看如何正确使用.get_profile()并找到AUTH_PROFILE_MODULE设置(我将稍微指定我的设置)。
使用本网站: http://www.turnkeylinux.org/blog/django-profile我发现了一些使用.get_profile()的其他方法,但仍然没有任何效果。 (我不会添加我尝试的其余链接,因为我可以继续一段时间)

回到问题,任何人都可以推荐一种可行的方法,以便我可以获取用户信息以设置一些默认值,以便在他们选择不编辑它们时保持其当前设置,并仅使用新提交的更新值。

到目前为止,我已经:(希望所有相关部分)

文件目录: 〜/文档/ PROJECT1

settings.py

AUTH_PROFILE_MODULE = "accounts.Account"

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

档案位置: PROJECT1 /帐户

models.py

# additional model to incorporate our custom fields to the auth user model                                                                                   
class Account(models.Model):
    userLink = models.OneToOneField(User)      #link (pointer) to the users other     information in User model                                                  
    birthdate = models.DateField(blank = True) # True makes this field optional                                                                              
    gender = models.CharField(max_length = 1, choices = GENDER_CHOICE, null = True)

    def __unicode__(self):            # define a unicode for the user to access                                                                              
        return u'%s %s' % (self.userLink.first_name, self.userLink.last_name)   # return first and last name

# custom Form to change user account information (can't be a modelForm)                                                                                      
class EditAccountForm(forms.Form):
    gender = forms.CharField(max_length = 1)#, choices = GENDER_CHOICE, null = True)                                                                         
    birthdate = forms.DateField(widget = SelectDateWidget()) # True makes this field   optional

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~

views.py

# Account settings view                                                                                                                                      
@login_required
def AccountSettings(request):
    sluggedSettingError = request.GET.get('error', '') # error message with slugged character                                                                
    settingError = sluggedSettingError.replace('-', ' ')
    settingForm = AdditionalForm(request.POST or None) # variable is called in     edit_user.html                                                                
    # might want to have some way to create a new profile if the account doesn't exist                                                                       
    userSettings = Account.objects.filter(userLink=request.user)
#    userSettings = request.user.get_profile() # returns the current settings of the     users profile                                                           
#### Currently trying to get it to let me use get_profile() ########                                                                                         
    print "userLink = %s" % userSettings#.user                                                                                                               
#    print "Gender = %s" % userSettings.gender # testing print                                                                                               
    if request.method == 'POST':
#        if settingForm.is_valid():                                                                                                                          
#            settingForm.save();                                                                                                                             
        return HttpResponseRedirect('/')
    return render_to_response("user_settings.html", {'settingForm': settingForm,   'settingError': settingError}, context_instance = RequestContext(request))
#        gender = request.POST['gender']  # pass in the gender variable from post                                                                            
#        birthdate = request.POST['birthdate']   # pass in the birthdate from post        

由于代码目前我放弃了.get_profile()方法并尝试通过可用帐户进行查询,直到找到匹配的userLink,然后将其保存到变量“userSettings”。我采用的方法是使用此变量作为userSettings.gender,userSettings.birthdate等来访问每个用户设置,如果更新则更改它们,如果没有则设置为先前的值(使用一系列if语句或一些内置Django功能)。

我不确定这是否是最有效的方法,或者我是否应该恢复到get_profile()方法。当我使用get_profile()(因为它当前在注释掉的行中键入)我得到以下错误     无法将关键字“用户”解析为字段。选项包括:birthdate,gender,id,userLink

我还尝试使用userLink定义为“user”的新数据库,以匹配django.docs网站指定但仍然存在关于帐户不存在的错误。我尝试创建一个尝试:除了:接近 https://bitbucket.org/filmaster/filmaster-test/src/1618b18003ed/film20/userprofile/views.py 处理这个错误,但这也没有产生任何积极的结果。

我没有关于如何让.get_profile()工作的想法,并且想不出任何允许我访问用户存储信息的内容,以便可以由它们以表格形式编辑它。我不确定我是否理解如何在这一点上正确使用它,并且觉得我此时只是绕圈跑来跑去。如果有人能帮助我,我会很感激。我试图提供尽可能多的相关信息,但是如果你需要别的东西来帮助我,请告诉我,我会尽快将其包括在内。

提前致谢!

2 个答案:

答案 0 :(得分:6)

要将配置文件附加到用户对象,您只需要在用户对象上调用get_profile()

user.get_profile()

例如,

request.user.get_profile()

上面的文档位于Django Docs。值得注意的是

  

如果一个配置文件不存在,方法get_profile()不会创建配置文件。

所以你必须有一个触发器来创建用户创建配置文件......

答案 1 :(得分:0)

user.get_profile()现已弃用,相反,假设您拥有使用用户模型的OneToOne,则可以使用user.profile