モデルから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.py
をfrom Django import forms
に追加するのを忘れたため、例外がスローされました。
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に変更しました
Relekangの答えをフォローアップするために、 return のように最後の行を思い出させて、フォームの送信時にオブジェクトのget_absolute_url()メソッドが自動的に呼び出されるようにする必要がありました。
return super(PointForm, self).save(commit=commit)