5

モデルとフォーム

class Book(models.Model):
  author = models.ForeignKey(User)
  name = models.CharField(max_length=50)

class BookForm(forms.ModelForm):
  class Meta:
    model = Book
    widgets = {
      'author': forms.HiddenInput(),
    }

この書籍フォームでは、著者を変更できません

テンプレート

しかし、私は彼のファーストネームを表示したい

<form action="/books/edit" method="post">{% csrf_token %}
  {{ form.author.label }}: {{ form.author.select_related.first_name }}
  {{ form.as_p }}
</form>

質問

もちろんform.author.select_related.first_name効かない

著者の名前を表示するにはどうすればよいですか?

4

2 に答える 2

10

これはうまくいくはずです:

<form action="/books/edit" method="post">{% csrf_token %}
  {{ form.author.label }}: {{ form.instance.author.first_name }}
  {{ form.as_p }}
</form>

ただし、このフォームは書籍の作成には使用できず、更新のみに使用できます。作成者がインスタンスに設定されていない場合、これは機能しません。

于 2012-04-26T13:07:00.983 に答える
0

読み取り専用フィールドを作成するのはどうですか?

class BookForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(BookForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.id:
            self.fields['author'].widget.attrs['readonly'] = True

    def clean_author(self):
        return self.instance.author

    class Meta:
        model = Book
        widgets = {
           'author': forms.TextInput(),
        }

メソッドは、clean_author作成者を上書きしようとする悪意のあるリクエストを防ぐためにあります。

于 2012-04-26T11:48:00.533 に答える