【问题标题】:django-profiles and nonetype userdjango-profiles 和非类型用户
【发布时间】:2012-02-17 07:00:59
【问题描述】:

我被难住了!

我正在构建一个表单,允许用户同时填写个人资料字段和用户字段。网上有很多例子,这个网站上有一个数字(例如How to create a UserProfile form in Django with first_name, last_name modifications?

但是,尽我所能,我继续在我的 form.py 中获得一个非类型用户

一些代码: forms.py

class ProfileForm(ModelForm):
first_name = forms.CharField(label="First name")
last_name = forms.CharField(label="Last name")

def __init__(self, *args, **kwargs):
    super(ProfileForm, self).__init__(*args, **kwargs)
    print self.instance #profile does not exist here 
    self.fields['first_name'].initial = self.instance.user.first_name
    self.fields['last_name'].initial = self.instance.last_name

def save(self, *args, **kwargs):
    super(ProfileForm, self).save(*args, **kwargs)
    self.instance.user.first_name = self.cleaned_data.get('first_name')    
    self.instance.user.last_name = self.cleaned_data.get('last_name')
    self.instance.user.save()

class Meta:
    model = UserProfile
    exclude = ('user')

urls.py

    url(r'^profiles/edit/', 'profiles.views.edit_profile', {'form_class': ProfileForm}, name='edit_profile' ),

模板.html

    <div class="clearfix">
    <legend>Edit your profile details</legend>
</div>
{% include 'profiles/profile_form.html' with user=user %}

视图来自 django-profiles,但我什至尝试拉入应用程序并看到我的用户存在并被拉入视图中的实例,该实例在表单中没有用户!

其他注意事项:我使用电子邮件作为我的身份验证方法而不是用户名,但仍然有一个基于文本的随机用户名(因为我知道电子邮件存在问题 作为 django-profiles 中的用户名)。这仍然是我的问题吗?

如果有帮助,这是我的验证定义:

    def authenticate(self, username=None, password=None):
    """ Authenticate a user based on email address as the user name. """
    try:
        user = User.objects.get(email=username)
        if user.check_password(password):
            return user
    except User.DoesNotExist:
        return None 

def get_user(self, user_id):
    """ Get a User object from the user_id. """
    try:
        return User.objects.get(pk=user_id)
    except User.DoesNotExist:
        return None

这是作为自定义后端的引用,我已经确认它可以工作。

我希望有人有一些见解!

编辑:

我的全部例外:

Exception Type: TemplateSyntaxError
Exception Value: Caught AttributeError while rendering: 'NoneType' object has no attribute 'first_name'
Exception Location:/Users/willcadell/placespeak/webapps/place/../place/accounts/forms.py in __init__, line 13

查看(来自 django-profiles):

def edit_profile(request, form_class=None, success_url=None,
             template_name='profiles/edit_profile.html',
             extra_context=None):

    try:

        profile_obj = request.user.get_profile()
        print profile_obj #profile is good here
    except ObjectDoesNotExist:
        return HttpResponseRedirect(reverse('profiles_create_profile'))

    if success_url is None:
        success_url = reverse('profiles_profile_detail', kwargs={ 'username': request.user.username })
    if form_class is None:
        form_class = utils.get_profile_form()      
    if request.method == 'POST':
        form = form_class(data=request.POST, files=request.FILES, instance=profile_obj)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(success_url)
    else:
        form = form_class(instance=profile_obj)

    if extra_context is None:
        extra_context = {}

    context = RequestContext(request)

    for key, value in extra_context.items():
        context[key] = callable(value) and value() or value

    return render_to_response(template_name,
                          { 'form': form,
                          'profile': profile_obj,},
                          context_instance=context)

我还添加了两个 cmets,指示配置文件存在的位置和不存在的位置,即它在视图中为 profile_obj 但在表单中不显示为 self.instance。

另一个(可能不相关的)症状是,对于这个异常页面,django 工具栏没有出现......很奇怪!

【问题讨论】:

  • 您能否发布您的观点和异常的完整回溯。
  • 已完成,感谢您的帮助!
  • 您有该用户的个人资料对象吗?
  • 是的,当我在视图中打印配置文件对象,然后打印 self.instance 时,我得到:QGZgEtyVvfoRbIehMAQwCohypuupxc 的配置文件和 None 的配置文件是大长随机字符串,因为我使用电子邮件作为 logi 并使用随机sting 作为伪用户名

标签: django django-profiles


【解决方案1】:

您可能并不总是有一个实例,这可能是它显示为无的原因。 努力去做

def __init__(self, *args, **kwargs):
    super(UserProfileForm, self).__init__(*args, **kwargs)
    if kwargs.has_key('instance'):
        instance = kwargs['instance']
        self.initial['first_name'] = instance.first_name
        self.initial['last_name'] = instance.last_name

另外,您使用的是来自user 对象的first_name,但来自user_profile 对象的last_name!我会保持一致。我正在使用下面的代码使它们在两个位置都可用

   # first_name - stores in auth.User
    def _get_first_name(self):
        return self.user.first_name
    def _set_first_name(self, name):
        self.user.first_name = name
    first_name = property(_get_first_name, _set_first_name)

    # last_name - stores in auth.User
    def _get_last_name(self):
        return self.user.last_name
    def _set_last_name(self, name):
        self.user.last_name = name
    last_name = property(_get_last_name, _set_last_name)

【讨论】:

  • 谢谢梅瑟姆!我实际上最终完全重写了视图。从而解决了我关于 first_ 和 last_name 的愚蠢错误(好地方!)我还最终在视图中设置了初始数据值。
  • Meitham,如果我有声望,我会给你一个 +1 :(
【解决方案2】:

这就是我最终做的:

view.py:

def edit_profile(request):

profile_obj = request.user.get_profile()
print dir(profile_obj.profileasset_set)
asset_obj = profile_obj.
user_obj = request.user

if request.method == 'POST':
    form = ProfileForm(request.POST, )
    if form.is_valid():

        profile_obj.twitter = form.cleaned_data['twitter']
        profile_obj.about = form.cleaned_data['about']
        profile_obj.url = form.cleaned_data['url']
        profile_obj.save()

        profile


        user_obj.first_name = form.cleaned_data['first_name']
        user_obj.last_name = form.cleaned_data['last_name']
        user_obj.save()

        form.save()
        return HttpResponseRedirect('/profiles/profile')

else:
    form = ProfileForm(instance=user_obj, 
        initial={
                 'first_name':user_obj.first_name,
                 'last_name':user_obj.last_name,
                 'twitter':profile_obj.twitter,
                 'url':profile_obj.url,
                 'about':profile_obj.about,
                }
        )

template = 'profiles/edit_profile.html'
data = {'form': form, }      
return render_to_response(template, data, context_instance=RequestContext(request))

forms.py:

class ProfileForm(ModelForm):

first_name = forms.CharField(label="First name")
last_name = forms.CharField(label="Last name")
twitter = forms.CharField(label="Twitter")
about = forms.CharField(label="About", widget=forms.Textarea)
url = forms.CharField(label="URL")

class Meta:
    model = UserProfile
    fields = ('url', 'twitter', 'about')

希望这对某人有所帮助!

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 2011-04-15
    • 2011-12-15
    • 2013-07-12
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2013-05-21
    相关资源
    最近更新 更多