Изменение данных в модели модели Django - PullRequest
1 голос
/ 10 июля 2009

Я получаю данные из POST и проверяю их с помощью этого стандартного фрагмента:

entry_formset = EntryFormSet(request.POST, request.FILES, prefix='entries')
if entry_formset.is_valid():
    ....

Модель формы EntryFormSet переопределяет виджет поля внешнего ключа для представления текстового поля. Таким образом, пользователь может ввести существующий ключ (предложенный через живой поиск Ajax) или ввести новый ключ, который будет легко добавлен.

Я использую этот блок try-Кроме того, чтобы проверить, если объект уже существует, и если нет, я добавлю его.

entity_name = request.POST['entries-0-entity']
try:
    entity = Entity.objects.get(name=entity_name)
except Entity.DoesNotExist:
    entity = Entity(name=entity_name)
    entity.slug = slugify(entity.name)
    entity.save()

Однако теперь мне нужно вернуть это entity в entry_formset. Он думает, что entries-0-entity это строка (вот как она появилась); как я могу напрямую получить доступ к этому значению entry_formset и получить вместо него ссылку на объект?

1 Ответ

2 голосов
/ 03 сентября 2009

Я бы предложил написать вспомогательную фабричную функцию для вашего набора форм, чтобы вы могли настроить виджет отображения в соответствии с данными. Примерно так:

def make_entry_formset(initial_obj=None, custom_widget=forms.Textarea):
    # these will be passed as keyword arguments to the ModelChoiceField
    field_kwargs={'widget': custom_widget,
                  'queryset': Entity.objects.all()}
    if initial_obj is not None:
        field_kwargs.update({'initial': initial_obj})
    class _EntryForm(forms.ModelForm):
        entity = forms.ModelChoiceField(**field_kwargs)

        class Meta:
            model = Entry
    return modelformset_factory(Entry, form=_EntryForm)

Затем в вашем коде просмотра вы можете указать виджет, который вы хотите, и связывать ли с начальным Entity объектом. Для первоначального рендеринга набора форм, где вам нужен только виджет Textarea и нет первоначального выбора, вы можете использовать это:

formset_class = make_entry_formset(custom_widget=forms.Textarea)
entry_formset = formset_class()

Затем, если вы хотите отрендерить его снова (после блока is_valid()) с уже определенным объектом Entity, вы можете использовать это:

formset_class = make_entry_formset(initial_obj=entity, 
                                   custom_widget=forms.HiddenInput)
entry_formset = formset_class(request.POST, request.FILES)

Конечно, вы можете использовать любой виджет, который вам нравится, но использование HiddenInput не позволит конечному пользователю взаимодействовать с этим полем (которое, как вам кажется, вы хотите связать с переменной entity, которую вы искали).

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