Как установить произвольные атрибуты в полях модели Django, а затем получить к ним доступ в ModelForm? - PullRequest
4 голосов
/ 10 октября 2010

Что делает Джанго

Атрибут «Пустое» поля модели Django, и способ его отрицания и превращения в атрибут «требуется» поля формы при создании ModelForm, довольно крутой. Это позволяет мне установить свойство для модели, к которой оно принадлежит, но иметь атрибут «required», доступный при обработке ModelForm, созданной из него. Наличие «требуемого» при рендеринге в шаблоне означает, что я могу делать классные вещи, такие как добавление звездочки к отображаемым меткам обязательных полей.

Модель

class Employee(models.Model):
    name = models.CharField(blank=False)
    public_bio = models.TextField(blank=False)
    salary= models.DecimalField(max_digits=15, decimal_places=2, blank=False)
    personnel_notes = models.TextField(blank=True)

Шаблон (с использованием ModelForm)

{% for field in form %}
    <p>
       {{ field.label }}{% if field.required %}*{% endif %}
       {{ field }}
    </p>
{% endfor %}

Что я хочу сделать

Но что, если я захочу сделать это со своим новым атрибутом? Его не нужно отменять / переводить так, как это делает пробел -> required, но я хочу, чтобы мой новый атрибут, определенный в поле модели, был доступен в моих полях формы. Например, допустим, я хочу указать пользователю, какие поля могут быть опубликованы:

Модель

class Employee(models.Model):
    name = models.CharField(blank=False, publishable=True)
    public_bio = models.TextField(blank=False, publishable=True)
    salary= models.DecimalField(max_digits=15, decimal_places=2, blank=False, publishable=False)
    personnel_notes = models.TextField(blank=True, publishable=False)

Шаблон (с использованием ModelForm)

{% for field in form %}
    <p>
       {{ field.label }}{% if field.required %}*{% endif %}
       {% if field.publishable %}(may be published){% endif %}
       {{ field }}
    </p>
{% endfor %}

Есть ли способ сделать это? Пытаясь это, я сразу же сталкиваюсь с проблемой определения модели, где django.db.models.fields.Field.__init__() даже не принимает kwargs. Если это невозможно, какие-либо идеи для обхода, чтобы получить желаемое поведение?

Ответы [ 2 ]

1 голос
/ 10 октября 2010

Обратите внимание, что доступное для публикации должно быть свойством в формах. Поле, а не в моделях. Поле, чтобы оно отображалось в шаблоне.

Вы можете явно добавить это в поля, которые вы хотите опубликовать в инициации формы, и они будут доступны вам при визуализации:

class PublishableForm(forms.Form):
    name = forms.CharField()

    def __init__(*args, **kwargs)
       super(PublishableForm, self).__init__(*args, **kwargs)
       self.name.publishable = True
0 голосов
/ 11 октября 2010

Вы также можете сделать вид декоратора для полей модели:

def publishable(field):
    field.publishable = True
    return field

#...

name = publishable(models.CharField(...))

Затем переопределите __init__ формы, чтобы использовать эти поля.

Также не забывайте, что используя {{ form.name }}в шаблоне возвращается BoundField.Чтобы получить оригинальное поле формы, вы должны использовать {{ form.name.field }}.

...