我正试图从这个解决方案构造一个ModelForm,但是我得到了这个错误:

'User' object has no attribute 'get'

其思想是让ModelForm构造一个表单,当提交时,登录的用户会更新条目。
models.py是:
class UserDetailsForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ['mobile_phone']

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        return super(UserDetailsForm, self).__init__(*args, **kwargs)

    def save(self, *args, **kwargs):
        kwargs['commit']=False
        obj = super(UserDetailsForm, self)
        if self.request:
            obj.user = UserProfile.objects.get(user=self.request.user)
        obj.save()

我在models.py中的模型是
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    mobile_phone = models.CharField(max_length=30,help_text='Max 30 characters.',blank=True)
    #have shortened this for simplicity
    def __unicode__(self):
        return self.mobile_phone

根据请求,这里是views.py中问题的回溯:
    userprofile = UserProfile.objects.get(user=request.user)
    if request.method == 'POST':
        form = UserDetailsForm(request.user, request.POST, request.FILES)
        if form.is_valid(): # it dies here
            form.save()
            return HttpResponseRedirect('/members-contact/')

最佳答案

你需要简单一点的东西。将此作为您的模型表单:

class UserDetailsForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ['mobile_phone']

在您看来:
from django.core.urlresolvers import reverse_lazy
from django.views.generic import UpdateView
from .models import UserDetailsForm, UserProfile

class UpdateProfile(UpdateView):
     template_name = 'users/update_profile.html'
     form_class = UserDetailsForm
     model = UserProfile
     success_url = reverse_lazy('home')

     def get_object(self, queryset=None):
         '''This loads the profile of the currently logged in user'''

         return UserProfile.objects.get(user=self.request.user)

     def form_valid(self, form):
         '''Here is where you set the user for the new profile'''

         instance = form.instance # This is the new object being saved
         instance.user = self.request.user
         instance.save()

         return super(UpdateProfile, self).form_valid(form)

urls.py中,您需要确保使用登录用户调用视图:
from django.contrib.auth.decorators import login_required
from django.views.generic TemplateView

from .views import UpdateProfile

urlpatterns = patterns('',
    (r'^profile/update/$', login_required(UpdateProfile.as_view())),
    (r'^$', TemplateView.as_view(template='index.html'), name='home'),
)

关于python - “用户”对象没有属性“获取”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18184415/

10-14 19:06
查看更多