Django Формы со значениями полей c - PullRequest
0 голосов
/ 16 марта 2020

Первый раз, используя Django Формы. Я застрял, пытаясь перезагрузить выпадающий список. Мой forms.py ниже. Когда состояние базы данных меняется, выбор не меняется. Я предполагаю, что это потому, что они определены на уровне класса, что означает, что запрос происходит при инициализации модуля? Я обнаружил, что единственный способ обновить мои выпадающие списки - это перезапустить веб-сервер.

Как я могу оценивать запросы к базе данных при каждом запросе?

forms.py

from django import forms 
from app.models import Collection, ErrorMessage, Service

class FailureForm(forms.Form):
    collections = [(collection.value,)*2 for collection in Collection.objects.all()]
    error_messages = [(message.value,)*2 for message in ErrorMessage.objects.all()]
    services = [(service.value,)*2 for service in Service.objects.all()]

    collection = forms.CharField(label='collection', max_length=100, widget=forms.Select(choices=collections))
    error_message = forms.CharField(label='error_message', max_length=400, widget=forms.Select(choices=error_messages))
    service = forms.CharField(label='service', max_length=100, widget=forms.Select(choices=services))

Ответы [ 2 ]

1 голос
/ 16 марта 2020
class FailureForm(forms.Form):
    collection = forms.ChoiceField(widget=forms.Select, choices=[])
    ... # etc

    def __init__(self, *args, **kwargs):
        super(FailureForm, self).__init__(*args, **kwargs)
        self.fields['collection'].choices = [(collection.value,)*2 for collection in Collection.objects.all()]
        ... # etc

Примечание: label='collection' устарело. По умолчанию это будет «коллекция». То же самое с сообщением об ошибке и сервисом

0 голосов
/ 17 марта 2020

Еще немного покопался в документации и заметил, что вызовы на ChoiceField вызываются при каждой инициализации. Поэтому решение, представленное ниже, я считаю более предпочтительным для меня.

class FailureForm(forms.Form):
    collection = forms.ChoiceField(choices=lambda: [(collection.value,)*2 for collection in Collection.objects.all()])
    error_message = forms.ChoiceField(choices=lambda: [(message.value,)*2 for message in ErrorMessage.objects.all()])
    service = forms.ChoiceField(choices=lambda: [(service.value,)*2 for service in Service.objects.all()])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...