0

私はインターネットで見つけたほとんどすべてのアイデアを試しましたが、それでも機能していません。

class RankedSkill(models.Model):
    RANK_CHOICES = (
        (1, 1),
        (2, 2),
        (3, 3),
        (4, 4),
        (5, 5),
        (6, 6),
        (7, 7),
        (8, 8),
        (9, 9),
        (10, 10),
    )
    skill = models.ForeignKey(Skill, related_name='ranks')
    rank = models.IntegerField(max_length=2, choices=RANK_CHOICES)
    assessment = models.ForeignKey(Assessment, related_name='skill_ranks')
)

評価とスキルは別のモデルです。私のアプリでは、スキルごとにフォームを作成してランク付けしたいと思います。そのためにdjangoフォームセットを使用しました。Skill.objects.all()で取得した初期データを使用して、RankedSkillFormsからフォームセットを作成します。

skills = Skill.objects.all()
SkillFormSet = formset_factory(SkillRankForm, max_num=skills.count())
if request.method == 'POST':
    formset = SkillFormSet(request.POST)
    if formset.is_valid:
        person = get_object_or_404(People, id=person_id)
        assessment = Assessment.objects.create(supervisor=request.user, employee=person)
        for form in formset.forms:
            ranked_skill = form.save() # error coming from here
            ranked_skill.assessment = assessment
            ranked_skill.save()
    else:
        return render(request, 'people/make_assessment.html', {'formset': formset})
else:
    initial = []
    for skill in skills:
        initial.append({'skill': skill})
    formset = SkillFormSet(initial=initial)
    return render(request, 'people/make_assessment.html', {'formset': formset})

保存しようとするまで、すべて正常に動作します。

初期データ(スキル)をu'SkillObject'文字列として取得します。(ユニコードを削除しました。以前は、u'Skill Object'文字列の代わりにスキルの名前が表示されていたためです)

エラーメッセージは「「u'スキルオブジェクト'を割り当てることができません」:「RankedSkill.skill」は「スキル」インスタンスである必要があります。」です。

4

1 に答える 1

1

PKSkillRankFormまたはインスタンスの代わりに文字列を受け入れています。

あなたはどちらかをする必要があります...

フォームを変更して、テキストではなくPKを使用するようにします。たとえばskills = forms.ModelChoiceField
、入力文字列をフォーム(またはビュー)のスキルオブジェクトに強制変換します。

        ranked_skill = form.save(commit=False)
        skill, created = Skill.objects.get_or_create(name=form.cleaned_data['skill'])  
                                           #^^^^ assuming there's a name field
        ranked_skill.skill = skill
        ranked_skill.save()

また、もう1つ...フォームセットの検証を修正する必要があります。

if formset.is_valid: 
               #^^^ you need to call is_valid() or this will always return True.
于 2013-01-31T22:20:46.613 に答える