Создание UpdateForm с использованием ModelForm в Django - PullRequest
3 голосов
/ 13 июля 2020

У меня есть приложение Django, и я хочу создать форму обновления с помощью ModelForm, но мне нужно получить параметр fields из модели user_profile. Итак, я создал свою форму и представление, как показано ниже.

forms.py;

class UpdateForm(forms.ModelForm):
    class Meta:
        model = Data
        fields = []
        
    def __init__(self, *args, **kwargs):
        input_choices = kwargs.pop('input_choices')
        super(UpdateForm, self).__init__(*args,**kwargs)
        self.fields = input_choices

views.py;

@login_required(login_url = "user:login")
def updateData(request,id):
    features = request.user.profile.selected_features
    instance = get_object_or_404(Data,id = id)
    
    form = UpdateForm(request.POST or None, input_choices=features, instance=instance)

    if form.is_valid():
        data = form.save(commit=False)
        data.author = request.user
        data.save()
        return redirect("data:dashboard")
    return render(request,"update.html",{"form":form})

Однако я получаю ошибка list indices must be integers or slices, not str в строке return render(request,"update.html",{"form":form}). Возникла проблема с параметром fields, но я ничего не нашел.

Как передать параметр fields из представления в ModelForm?

1 Ответ

2 голосов
/ 13 июля 2020

Вы можете использовать modelform_factory для создания формы с динамическими c полями

from django.forms import modelform_factory

@login_required(login_url = "user:login")
def updateData(request,id):
    features = request.user.profile.selected_features
    instance = get_object_or_404(Data, id=id)
    UpdateForm = modelform_factory(Data, fields=features)
    form = UpdateForm(request.POST or None, instance=instance)

Если features - это набор запросов, вам, вероятно, придется что-то использовать например, features.values_list('name', flat=True), чтобы получить только имена полей

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