Django custom forms with models, also with 'choices' as values, how should I approach this problem?
у меня очень сильно болит голова...
Я бьюсь над этим уже 2 часа
Я хотел сделать пользовательскую форму для модели, чтобы иметь возможность добавлять в нее объекты, а также перемещать поля по своему усмотрению (вместо использования form.as_p (или form|crispy), я хотел поместить всю форму в таблицу типа grid, используя пользовательский шаблон, а не только помещать одно под другое), но всякий раз, когда я помещаю поле выбора (которое является либо полем выбора, либо foreignkey), их значения пусты, а также, 3 из 4 полей формы фактически отображаются, одно остается по умолчанию.
В нем содержится fields='__all__'
с 3 полями выбора и 1 плавающим полем, каждое с меткой, больше ничего.
Для отображения форм в html я использовал
{% for field in form.visible_fields %}
{{ field.label_tag }}
{{ field.errors }}
{{ field }}
{{ field.help_text }}
{% endfor %}
, который работает хорошо. Я пытаюсь решить проблему неправильным способом? Я вернусь к этой теме завтра, сейчас мне нужно немного отдохнуть, но я не понимаю, почему передача choices=TheModel # or # choices=TheModel.ojbects.all()
ломает все дело.
Есть ли сайт или канал youtube, который показывает некоторые решения этих проблем?
Я перерыл кучу сайтов и видео, но они никогда не обращаются к внешним ключам как к значениям форм (выпадающих элементов), никогда не делают сгруппированные выпадающие элементы (которые я сделал и которые работают без пользовательских форм).
Выборы должны быть кортежем следующего вида:
[
('CHOICE_ONE', 'choice_one')
]
Итак, вы можете создать список выбора следующим образом (Предположим, что TheModel
имеет поле name
.)
choices = [(i.id, i.name) for i in TheModel.objects.all()]
Второе значение будет отображаться пользователю, первое будет установлено в базе данных.
Вы можете использовать ModelChoiceField:
class FooMultipleChoiceForm(forms.Form):
foo_select = forms.ModelMultipleChoiceField(queryset=None)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['foo_select'].queryset = ...
https://docs.djangoproject.com/en/4.1/ref/forms/fields/#modelchoicefield