Обновление формы Django после добавления данных в базу - PullRequest
0 голосов
/ 24 ноября 2018

Я создаю форму для пользователя, чтобы выполнить запрос к базе данных.Модель называется Sample, и пользователь выбирает имена, которые он хочет включить в результаты запроса.В этом случае поле имени уникально, но другие поля, выполненные таким же образом, не являются.

Form.py

from django import forms
from .models import Sample

class SampleForm(forms.Form):
    samples = Sample.objects.all()
    names = [(s.id, s.name) for s in samples]
    initial = [c[0] for c in names]
    Rock_Names = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple,
                                          choices=names,
                                          initial=initial,
                                          label='Name')

Проблема, с которой я столкнулся,после добавления нового образца форма не будет обновляться с этим именем, пока я не перезапущу сервер.У меня есть представление списка для всех образцов, и он обновляется с новым образцом в порядке.Я попытался запустить Sample.objects.update() после сохранения нового образца, но это не помогло.Есть ли способ заставить это обновить?Есть ли лучший способ создать форму запроса?

Редактировать Хорошо, я подумал над этим и понял, что это более простая проблема объектно-ориентированного программирования.Форма создается с использованием атрибутов класса, определенных в определении класса (при перезапуске сервера), а не при создании экземпляра (при перезагрузке страницы).Я не думаю, что хочу перезапускать создание формы каждый раз при загрузке страницы (например, переход к атрибутам экземпляра в методе init), поэтому я переместил создание формы в функцию, которая вызывается при определении класса и через метод Iмогу позвонить, когда добавлю данные.Новый код выглядит так:

from django import forms
from .models import Sample

def create_form():
    samples = Sample.objects.all()
    names = [(s.id, s.name) for s in samples]
    initial = [c[0] for c in names]
    Rock_Names = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple,
                                          choices=names,
                                          initial=initial,
                                          label='Name')
    return Rock_Names

class SampleForm(forms.Form):
    Rock_Names = create_form()

   def update_form():
      Rock_Names = create_form()

1 Ответ

0 голосов
/ 24 ноября 2018

Если у вас есть поле выбора с динамическим выбором, рекомендуется установить его в методе __init__.

В вашем случае вы, вероятно, можете просто использовать ModelMultipleChoiceField вместо MultipleChoiceField:

class SampleForm(forms.Form):

    rock_names = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple,
                                          queryset=Sample.objects.all(),
                                          label='Name')

Чтобы получить Sample.name в качестве метки, вы должны либо указать Sample a __str__ метод:

class Sample(models.Model):

    ...

    def __str__(self):
        return self.name

Или создать и использовать подкласс ModelMultipleChoiceField с помощью пользовательского label_from_instance метода:

class SampleMultipleChoiceField(MultipleChoiceField):

    def label_from_instance(self, obj):
        return obj.name


class SampleForm(forms.Form):

    rock_names = SampleMultipleChoiceField(widget=forms.CheckboxSelectMultiple,
                                          queryset=Sample.objects.all(),
                                          label='Name')

В примечании к соглашению принято записывать атрибуты класса в нижнем регистре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...