web-dev-qa-db-ja.com

Djangoモデルから生成されたModelFormに追加フィールドを追加

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

具体的には、画像上にマーカーとパスを生成するJAppletがあり、サーバー上でPOST.

私のモデルでは、ラインは2つのマーカーで構成されています。しかし、I POST it、データベースからではなく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

管理ページをロードしようとするとエラーが生成されます。このページにはフォームへの参照がまったくありません。

例外の解決策

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

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

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

51
Marco Fedele

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)

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

64
relekang

Relekangの答えをフォローアップするために、 return のように最後の行を思い出させて、フォームの送信時にオブジェクトのget_absolute_url()メソッドが自動的に呼び出されるようにする必要がありました。

return super(PointForm, self).save(commit=commit)
5
ZG101