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 回答