69

モデルからFormSetを生成する必要がありますが、すべてのフォームに「追加の値」を挿入する必要があります。

具体的には、画像上にいくつかのマーカーとパスを生成し、それをサーバーにPOSTするJAppletがあります。

私のモデルでは、線は2つのマーカーで構成されています。しかし、POSTすると、データベースからではなくJAppletから生成されたIDを使用しているため、パスがどのマーカーから作成されるかわかりません。

そこで、フォームのマーカーに「一時ID」を挿入し、パスを保存する前にビューで正しい配置を行うことを考えました。

マーカーのカスタムフォームを定義することを考えましたが、あまり乾燥していないようで、マーカーモデルを変更してもこれに戻りたくありません。

フォームは次のとおりです。

  class PointForm(forms.ModelForm):
    temp_id = forms.IntegerField()
    class Meta:
            model = Point

    def clean(self):
            if any(self.errors):
                    # Don't bother validating the formset unless each form is valid on its own
                    return

            ingresso = self.cleaned_data['ingresso']
            ascensore = self.cleaned_data['ascensore']
            scala = self.cleaned_data['scala']

            if (ingresso and ascensore) or (ingresso and scala) or (ascensore and scala):
                    raise forms.ValidationError("A stair cannot be a elevator or an access!!!") 
            return self

    def save(commit=True):
    # do something with self.cleaned_data['temp_id']
            super(PointForm).save(commit=commit)

そしてモデル:

  class Point(models.Model):

    RFID = models.CharField(max_length=200, blank=True)

    x = models.IntegerField()
    y = models.IntegerField()

    piano = models.ForeignKey(Floor)

    ingresso = models.BooleanField()

エラー:

  ViewDoesNotExist at /admin/
  Could not import buildings.views.getFloors. View does not exist in module buildings.views.
  Request Method:   GET
  Request URL:  http://127.0.0.1:8000/admin/
  Django Version:   1.4.1
  Exception Type:   ViewDoesNotExist
  Exception Value:  
  Could not import buildings.views.getFloors. View does not exist in module buildings.views.
  Exception Location:   /usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py in get_callable, line 101

管理ページを読み込もうとするとエラーが発生します。このページにはフォームへの参照がまったくありません。

例外の解決策

さて、Djangoがなぜこんなに奇妙なことをしていたのかを知る方法をここに書きます。

ここで、問題が何であるかを見つける正しい方法です。

forms.pyに追加するのを忘れたため、例外がスローされましたfrom django import forms

4

2 に答える 2

83

ModelFormにフィールドを追加できます。モデルにtemp_idという名前のフィールドを追加しない限り、モデルを変更するときにこのフォームを変更する必要はありません。

例(Pointという名前のモデルを使用):

class PointForm (forms.ModelForm):
    temp_id = forms.IntegerField()

    class Meta:
        model = Point

    def save(self, commit=True):
        # do something with self.cleaned_data['temp_id']
        return super(PointForm, self).save(commit=commit)

更新: def save()で自分自身を忘れ、モデル名をPointに変更しました

于 2012-11-25T12:13:33.493 に答える
5

relekangの回答をフォローアップするには、図のように最後の行も返すように注意する必要がありました。これにより、フォームの送信時にオブジェクトのget_absolute_url()メソッドが自動的に呼び出されます。

return super(PointForm, self).save(commit=commit)
于 2015-03-18T09:40:05.483 に答える