【问题标题】:Django/Python: ValueError at /foo/barDjango/Python:/foo/bar 处的 ValueError
【发布时间】:2012-09-05 12:39:00
【问题描述】:

我在使用 django 表单时遇到了一些问题。这是我得到的错误:

ValueError at /coach/new/
Cannot assign "u'7'": "Course.category" must be a "Category" instance.

views.py

def create_course_page(request):
if request.method == 'POST': # If the form has been submitted...
    form = CreateCourseForm(request.POST) # A form bound to the POST data
    #form.data['category'] = Category.objects.get(pk=form.data['category']),
    if form.is_valid(): # All validation rules pass
        cleaned_data = form.cleaned_data
        my_course = Course(
            title = cleaned_data['title'],
            prerequisite = cleaned_data['prerequisite'],
            category = Category.objects.get(pk=cleaned_data['category']),
            short_description = cleaned_data['short_description'],
            #listing_city = cleaned_data['xxxx'],
            date_created = datetime.now(),
            date_last_updated = datetime.now(),
            teacher = request.user,
        )
        my_course.save()
        return HttpResponseRedirect('/') # Redirect after POST
    else:
        return HttpResponseRedirect('/wtf') # Redirect after POST
else:
    my_course = Course()
    form = CreateCourseForm(instance=my_course) # An unbound form

return render(request, 'learn/new_course.html', {
    'form': form,
})

我试图用“form.data['category'] = Category.objects.get(pk=form.data['category'])”来解决这个问题,但那行不通。

有人有更好的主意吗?非常感谢。

编辑: Traceback 显示错误发生在

if form.is_valid(): # All validation rules pass 

编辑2: 这可能会更好地解释为什么 django 表单不能与“默认”编程一起使用:

forms.py

def categories_as_choices():
categories = [(u'', u'')] # So select box get's an empty value/default label
for category in Category.objects.all():
    new_category = []
    sub_categories = []
    for sub_category in category.get_children():
        sub_categories.append([sub_category.id, sub_category.name])

    new_category = [category.name, sub_categories]
    categories.append(new_category)
return categories

class CreateCourseForm(ModelForm):
category = forms.ChoiceField(choices=categories_as_choices()) #chzn-select
class Meta:
    model = Course
    fields = ('title', 'category')

def __init__(self, *args, **kwargs):
    super (CreateCourseForm, self).__init__(*args, **kwargs)
    self.fields['category'].widget.attrs['class'] = 'chzn-select'

【问题讨论】:

    标签: python django forms django-forms


    【解决方案1】:

    试试这个

    get_cat_name =  form.cleaned_data['category']
    
    get_obj = Category.objects.get(category = get_cat_name)
    
    category = get_obj.id  
    

    【讨论】:

      【解决方案2】:
      category = Category.objects.get(pk=cleaned_data['category'])
      

      通常您不需要相关的Category 对象,只需提供cleaned_data 就足够了,而且是正确的方法。

      my_course = Course(......, category = cleaned_data['category'], ...)
      

      或者,如果您必须使用相关的类别 ID,则每个 ForeignKey 模型字段都可以用作 <field_name>_id。但是你必须提供一个有效的外键,而不是相关的对象。

      my_course = Course(......, category_id = 8, ...)
      

      【讨论】:

        【解决方案3】:

        你可以试试

        my_course = Course(..., category = form.cleaned_data['category']), ...)
        

        form.cleaned_data 将具有类别实例。

        但是,更推荐的方法是将表单另存为

        my_course = form.save()
        

        如果您想手动更改某些字段,请执行此操作

        my_course = form.save(commit=False)
        my_course.some_field = some_value
        ...
        my_couse.save()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-04
          • 2022-11-04
          • 2014-03-20
          • 1970-01-01
          • 2017-06-23
          • 2012-01-25
          相关资源
          最近更新 更多