Многие поля в форме с установленными флажками выберите поле в шаблоне Django - PullRequest
2 голосов
/ 25 декабря 2011

У меня есть модель с ManyToManyField. Теперь мне нужна форма, но не нужно выбирать поле в шаблоне.

class Foo(models.Model):
    name = models.CharField(max_length=50)
    short_description = models.CharField(max_length=100)
    price = models.IntegerField()

    def __unicode__(self):
        return self.name

class Bar(models.Model):
    foo = models.ManyToManyField(Foo, blank=True, null=True, related_name='foos')

    def __unicode__(self):
        return unicode(self.id)

Что мне действительно нужно, так это отобразить все данные из модели Foo с флажками в шаблоне вместо поля выбора, которое у меня есть, если использовать model.Form и вызов {{form}} в шаблоне.

class BarForm(forms.ModelForm):
    class Meta:
        model = Bar

view.py

def show_form(request, id):
    foo = get_object_or_404(Foo, id=id)
    form = BarForm()
    ...

1 Ответ

3 голосов
/ 25 декабря 2011

Чтобы отображать ManyToManyField как флажки вместо поля выбора, необходимо установить виджет в классе Meta соответствующего подкласса ModelForm.Затем, чтобы отобразить пользовательскую метку на каждом флажке, создайте свой собственный класс поля формы, полученный из ModelMultipleChoiceField, и переопределите label_from_instance.Вы также можете добавить HTML-теги в строку, возвращаемую label_from_instance, чтобы она выглядела так, как вам хочется, но не забудьте обернуть возвращенную строку mark_safe .

from django.forms.widgets import CheckboxSelectMultiple
from django.forms.models import ModelMultipleChoiceField
...
class CustomSelectMultiple(ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return "%s: %s %s" %(obj.name, obj.short_description, obj.price)

class BarForm(forms.ModelForm):
    foo = CustomSelectMultiple(queryset=Foo.objects.all())
    class Meta:
        model = Bar
        widgets = {"foo":CheckboxSelectMultiple(),}
...