У меня есть модель, называемая формами, которую можно редактировать из админ-панели со списком полей, скажем, 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. Или даже когда я инициализирую его и хочу, чтобы пользователь уже заполнил какое-то поле, например, Имя, Фамилия и Электронная почта.