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 に答える