Django Создание формы Dynami c - PullRequest
0 голосов
/ 27 марта 2020

У меня есть модель, называемая формами, которую можно редактировать из админ-панели со списком полей, скажем, text1, text2, text3, image1, image2, image3. Администратор может вводить и вводить значения для них, скажем, text1 = 'Имя', text2 = 'Фамилия', text3 = 'Электронная почта', image1 = 'Lo go', image2 = '', image3 = '' , Затем у меня есть другая модель, называемая автоматизацией, с полями тех же полей, но значения соответствуют тому, что ей соответствует (поэтому в модели Form все они являются CharField, но в модели автоматизации у них есть соответствующее поле CharField, ImageField, FileField и т. Д. c) ,

Цель состоит в том, чтобы отобразить форму, которая отображает только те поля, которые действительно имеют значение в форме, и это значение является меткой для формы. Таким образом, для приведенного выше примера вы получите такую ​​форму:

Имя: Фамилия: Электронная почта: Lo go:

И изображение 2 и изображение 3 не отображаются, потому что там не имеет значения для тех, кто находится в модели Form.

Мне удалось получить это, работая с кодом ниже:

файл forms.py

def get_automation_form(data):
    class AutomationForm(forms.ModelForm):
        class Meta:
            model = Automation
            fields = data[0]
            labels = data[1]

    return AutomationForm

views.py file

@login_required
def form(request):
    if request.method == 'GET':
        nickname = request.GET.get('nickname')
    elif request.method == 'POST':
        nickname = request.POST.get('nickname')

    builder = Builder.objects.filter(nickname=nickname).first()

    automation_fields = ['text_field01', 'text_field02', 'text_field03', 'text_field04', 'text_field05', 'text_field06',
                         'text_field07', 'text_field08', 'text_field09', 'text_field10', 'image_field01',
                         'image_field02', 'image_field03', 'image_field04', 'image_field05', 'image_field06',
                         'image_field07', 'image_field08', 'image_field09', 'image_field10', 'image_field11',
                         'image_field12', 'image_field13', 'image_field14', 'image_field15', 'image_field16',
                         'image_field17', 'image_field18', 'image_field19', 'image_field20', 'video_field01',
                         'video_field02', 'video_field03', 'video_field04', 'video_field05', 'video_field06',
                         'video_field07', 'video_field08', 'video_field09', 'video_field10', 'video_field11',
                         'video_field12', 'video_field13', 'video_field14', 'video_field15', 'video_field16',
                         'video_field17', 'video_field18', 'video_field19', 'video_field20', 'color1', 'color2',
                         'color3', 'color4', 'color5', 'music_selection'
                         ]

    fields = ['first_name', 'last_name', 'email']
    labels = {
            'first_name':'First Name',
            'last_name':'Last Name',
            'email': 'Email'
        }

    for field in automation_fields:
        if getattr(builder.form, field) != "":
            if field == 'music_selection':
                fields.append(field)
                labels[field] = 'Music Selection'
            else:
                fields.append(field)
                labels[field] = getattr(builder.form, field)

    music_selection = getattr(builder.form, 'music_selection')

    user_info = {
        'first_name': request.user.first_name,
        'last_name': request.user.last_name,
        'email': request.user.email,
    }

    data = [fields, labels, music_selection]

    if request.method == 'POST':
        a_form = get_automation_form(data)
        # print(a_form.is_valid())
        # if a_form.is_valid():
        #     form = a_form.save(commit=False)
        #
        #     form.user = request.user
        #     a_form.save()

        messages.success(request, f'Your Builder has been submitted!')

        return redirect('builder-home')
    else:
        a_form = get_automation_form(data)

    data = {
        'a_form':a_form,
        'builder':builder
    }

    return render(request, 'builder/form.html', data)

Проблема возникает, когда я пытаюсь сохранить ее и передать данные POST. Или даже когда я инициализирую его и хочу, чтобы пользователь уже заполнил какое-то поле, например, Имя, Фамилия и Электронная почта.

...