4

モデル:

class Session(models.Model):
  tutor = models.ForeignKey(User)
  start_time = models.DateTimeField()
  end_time = models.DateTimeField()
  status = models.CharField(max_length=1)

形:

class SessionForm(forms.ModelForm):
  class Meta:
    model = Session
    exclude = ['tutor']

テスト:

>>> ses = Session.objects.get(pk=1)
>>> ses
<Session: Robert - 2012-04-18 13:00:00>
>>> form = SessionForm(instance=ses)

statusたとえば、このインスタンスののみを更新して保存したいと思います。
どうやってやるの ?


編集

レンプレート:

<form action="fhjsdhkl" method="POST">{{ csrf_token }}
  <input name="start_time" />
  <input name="end_time" />
</form>

これらの2つのフィールドのみを投稿しようとしています:

if request.method == 'POST':
  form = SessionForm(request.POST)
  if request.POST['id']:
    try:
      s = Session.objects.get(pk=request.POST['id'])
      form.instance = s
    except Session.DoesNotExist:
      pass
  if form.is_valid():
    form.save()

データが検証されなかったため、セッションを変更できませんでした。

フォームによるエラーリターンは次のとおりです。

status-このフィールドは必須です

更新する必要のあるフィールドは固定されていないので、毎回すべてのフィールドを投稿することは避けたいと思います。ケースごとに異なるフォームを作成する必要がありますか?

4

1 に答える 1

4

編集2:古い答えは無関係です

if request.method == 'POST':
  form = SessionForm(request.POST)
  if request.POST['id']:
    try:
      s = Session.objects.get(pk=request.POST['id'])
      form.instance = s
    except Session.DoesNotExist:
      pass
  if form.is_valid():
    form.save()

さて、あなたはここで起こっている多くのことを持っています:

1.1。

この行は次のようになります。

form = SessionForm(request.POST, instance = s)

2.2。

セッションオブジェクトを上に移動する必要があります。

if request.method == 'POST':
    s = get_object_or_404(Session, pk=request.POST['id'])
    form = SessionForm(request.POST, instance = s)

以下のtryandexceptメソッドを実行すると、そのオブジェクトが存在しない場合は常に検証エラーが発生します。代わりに404を投げます。ドキュメントは上記のショートカットにあります:https ://docs.djangoproject.com/en/1.0/topics/http/shortcuts/#get-object-or-404まだインポートしていない場合は、インポートする必要があります。

これで、それを評価して保存できます。

if request.method == 'POST':
    s = get_object_or_404(Session, pk=request.POST['id'])
    form = SessionForm(request.POST, instance = s)
    if form.is_valid():
        form.save()

3.3。

さらに、これを行うべきではありません。文字列としてのrequest.POST ['id']がFalseになることはなく、空の文字列であってもです。たとえば、IDLEでこれを試してください。

>>> '' == True
>>> '' == False

>>> 'a' == True
>>> 'a' == False

これは常にFalseと評価されることに注意してください。

したがって、表示するのは実際に参照モデルを作成することではありませんでした。

于 2012-04-18T14:36:49.560 に答える