0

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

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

视图.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'])”来解决这个问题,但那是行不通的。

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

编辑:回溯显示错误发生在

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

EDIT2:这可能会更好地解释为什么 django 表单不适用于“默认”编程:

表格.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'
4

3 回答 3

0

尝试这个

get_cat_name =  form.cleaned_data['category']

get_obj = Category.objects.get(category = get_cat_name)

category = get_obj.id  
于 2012-09-05T12:50:43.283 回答
0
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, ...)
于 2012-09-05T12:52:16.957 回答
0

你可以试试

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()
于 2012-09-05T12:57:47.733 回答