【问题标题】:Django - pass a value from form to modelDjango - 将值从表单传递到模型
【发布时间】:2013-11-19 16:17:20
【问题描述】:

我正在使用 Django 表单模块来获取价值并将其传递给用户配置文件。 唯一的问题是 home_type 是“forms.ChoiceField”,但 forms.ChoiceField 没有“clean_data”类型,那么如何获取无线电选择值并将其传递给用户配置文件模块?

模块代码如下:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    name = models.CharField(max_length=30, blank=True)
    productNo = models.CharField(max_length=50, blank=True)
    location = models.CharField(max_length=50, blank=True)
    average_temp = models.CharField(max_length=5, blank=True)

    HOME_TYPE = (
        ('AP', 'Apartment/Condo'),
        ('SH', 'Single House/Residential'),
        ('ST', 'Studio'),
        ('TH', 'Townhouse'),
        ('MH', 'Moblie Home'),
    )

    home_type = models.CharField(max_length=1, choices=HOME_TYPE)

及表格代码:

class UserProfileForm(forms.Form):
    name = forms.CharField(label="Name", max_length=30, widget=forms.TextInput(attrs={'size':     20,}))
    productNo = forms.CharField(label="ProductNo", max_length=50, widget=forms.TextInput(attrs={'size': 20,}))
    location = forms.CharField(label="Location", max_length=50, widget=forms.TextInput(attrs={'size': 20,}))
    average_temp = forms.CharField(label="Average_Temp", max_length=10, widget=forms.TextInput(attrs={'size': 20,}))

    HOME_TYPE = (
        ('AP', 'Apartment/Condo'),
        ('SH', 'Single House/Residential'),
        ('ST', 'Studio'),
        ('TH', 'Townhouse'),
        ('MH', 'Moblie Home'),
    )

    home_type = forms.ChoiceField(label="home_type", widget=forms.RadioSelect(), choices=HOME_TYPE)

在我的view.py中,处理传值的代码是:

def user_profile_update(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/keenhome/accounts/login/')
    UserProfile = request.user.get_profile()
    if request.method == 'POST':
        form=UserProfileForm(request.POST)
        if form.is_valid():
            UserProfile.name = form.cleaned_data["name"]
            UserProfile.productNo = form.cleaned_data["productNo"]
            UserProfile.location = form.cleaned_data["location"]
            UserProfile.average_temp = form.cleaned_data["average_temp"]

            #problem happens here:
            UserProfile.home_type = form.cleaned_data["home_type"]

            UserProfile.save()
            return HttpResponseRedirect('/keenhome/accounts/user_profile/')
        else:
            form = UserProfileForm()      
            return render_to_response("polls/user_profile_update.html", {'form':form}, context_instance=RequestContext(request))

    else:
        form = UserProfileForm()
        return render_to_response("polls/user_profile_update.html", {'form':form}, context_instance=RequestContext(request))

唯一的问题是forms.ChoiceField 没有“clean_data”类型,那么我如何获取单选值并将其传递给用户配置文件模块?

【问题讨论】:

  • 查看我的帖子!!您需要排除用户...否则表单将无效,因为您没有在表单中设置它。
  • 嗨,void,我认为你是对的,我正在修改我的代码,如果它是真的,我会检查你的答案。谢谢。

标签: python django django-models django-forms django-views


【解决方案1】:

您不需要再次编写表单的所有字段。这就是它被称为 ModelForm 的原因,它应该是从模型中自动生成的:

HOME_TYPE = (
    ('AP', 'Apartment/Condo'),
    ('SH', 'Single House/Residential'),
    ('ST', 'Studio'),
    ('TH', 'Townhouse'),
    ('MH', 'Moblie Home'),
)

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    name = models.CharField(max_length=30, blank=True)
    productNo = models.CharField(max_length=50, blank=True)
    location = models.CharField(max_length=50, blank=True)
    average_temp = models.CharField(max_length=5, blank=True)
    home_type = models.CharField(max_length=2, choices=HOME_TYPE)

forms.py:

class UserProfileForm(ModelForm):
   class Meta:
       model = UserProfile
       exclude = (user,)

views.py:

def user_profile_update(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/keenhome/accounts/login/')
    form = UserProfileForm(request.POST or None)
    if request.method == 'POST':
        if form.is_valid():
            form.user = request.user
            form.save()
            return HttpResponseRedirect('/keenhome/accounts/user_profile/')
    return render_to_response("polls/user_profile_update.html", {'form':form}, context_instance=RequestContext(request))

编辑: 使 max_length = 2,感谢@ndpu,排除用户,在表单中添加用户保存,感谢@void

【讨论】:

    【解决方案2】:
    class UserProfile(models.Model):
        user = models.OneToOneField(User)
        .....
    
    
    class UserProfileForm(ModelForm):
        pass
        class Meta:
            model = UserProfile
            exclude = (user,) # you need to exclude user
    

    现在所有这些代码...:

    def user_profile_update(request):
        if not request.user.is_authenticated():
            return HttpResponseRedirect('/keenhome/accounts/login/')
        UserProfile = request.user.get_profile()
        if request.method == 'POST':
            form=UserProfileForm(request.POST)
            if form.is_valid():
                UserProfile.name = form.cleaned_data["name"]
                UserProfile.productNo = form.cleaned_data["productNo"]
                UserProfile.location = form.cleaned_data["location"]
                UserProfile.average_temp = form.cleaned_data["average_temp"]
    
                #problem happens here:
                UserProfile.home_type = form.cleaned_data["home_type"]
    
                UserProfile.save()
                return HttpResponseRedirect('/keenhome/accounts/user_profile/')
            else:
                form = UserProfileForm()      
                return render_to_response("polls/user_profile_update.html", {'form':form}, context_instance=RequestContext(request))
    
        else:
            form = UserProfileForm()
            return render_to_response("polls/user_profile_update.html", {'form':form}, context_instance=RequestContext(request))
    

    会变成:

    def user_profile_update(request):
        if not request.user.is_authenticated():
            return HttpResponseRedirect('/keenhome/accounts/login/')
    
        form = UserProfileForm(request.POST or None)
    
        if form.is_valid():
            form = form.save(commit=False) 
            form.user = request.user# because user is excluded
            form.save()
            #code
        else:
            #code
    
        return render_to_response("polls/user_profile_update.html", {'form':form}, context_instance=RequestContext(request))
    

    【讨论】:

      【解决方案3】:

      我认为问题出在这里:

      class UserProfile(models.Model):
          #...
          home_type = models.CharField(max_length=1, choices=HOME_TYPE)
      

      应该是max_length=2:

          home_type = models.CharField(max_length=2, choices=HOME_TYPE)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-13
        • 2011-11-22
        • 2021-01-09
        • 1970-01-01
        • 2014-06-21
        • 2021-07-06
        • 1970-01-01
        相关资源
        最近更新 更多