Форма на Django - выпадающее меню, соответствующее выбору моделей

Я создаю форму со всевозможными заголовками и вопросом перед каждым полем.

Сначала я создаю форму в Forms.py, но кажется довольно сложным настроить ее так, как мне нужно.

Я прибегнул к встраиванию формы в html-шаблон.

Я пытаюсь создать выпадающее меню.

В этом примере при выборе цвета у пользователей будет 4 варианта, перечисленных в списке choices в models.py. Я явно не связываю форму в шаблоне с реальной формой.

Что я делаю не так?

(я должен сказать, что я видел здесь пару вещей о наборах полей, но я не понимаю фактических решений, которые объясняются)

Вот код Models.py

LOOKCOLOUR=(
    (1,'Straw'),
    (2,'Yellow'),
    (3,'Gold'),
    (4,'Amber'),
)


class ChampageRating(models.Model):
    user = models.ForeignKey(User,blank=True, on_delete=models.CASCADE)
    product=models.ForeignKey(Product,related_name="champcomments", on_delete=models.CASCADE)
    look_colour=models.IntegerField(choices=LOOKCOLOUR, default=0)
    ..

    def __str__(self):
        return '%s - %s - %s'%(self.user, self.product, self.date_added)

forms.py

class ElderFlowerChampForm(ModelForm):
    
    class Meta:
        model = ChampageRating
        fields = ('look_colour', )
        labels ={
            'look_colour': 'Colour',

        }

        widgets = {
                    'look_colour':forms.Select(attrs={'class':'form-control'}),
                }

views.py

def elderflowerchamp(request, product_id):
    global ChampageRating
    product = Product.objects.get(pk=product_id)
    url = request.META.get('HTTP_REFERER')
    submitted = False
    try:
        if request.method == "POST":
            reviews = ChampageRating.objects.get(pk=product_id)
            if request.user.is_superuser:
                form = ElderFlowerChampFormAdmin(request.POST, instance=reviews)
                if form.is_valid():
                        form.save()
                        return redirect('home')
            else:
                form = ElderFlowerChampForm(request.POST, instance=reviews)
                if form.is_valid():
                    ChampageRating = form.save(commit=False)
                    ChampageRating.user = request.user
                    ChampageRating.save()
                    return redirect('home')
        else:
            #This part goes to the page, but doesnt submit
            reviews = ChampageRating.objects.get(pk=product_id)
            if request.user.is_superuser:
                form = ElderFlowerChampFormAdmin
            else:
                form = ElderFlowerChampForm
            if 'submitted' in request.GET:
                submitted = True
    except:
        reviews = None
        if request.user.is_superuser:
            form = ElderFlowerChampFormAdmin(request.POST)
            if form.is_valid():
                    data = ChampageRating()
                    data.rating = form.cleaned_data['rating']
                    data.look_colour = form.cleaned_data['look_colour']
                    data.ip = request.META.get('REMOTE_ADDR')
                    data.product_id = product_id
                    data.user_id = request.user.id
                    data.save()
                    messages.success(request, 'Thank you! Your review has been submitted.')
                    return redirect('home')
        else:
            form = ElderFlowerChampForm(request.POST)
            if form.is_valid():
                    data = ChampageRating()
                    data.rating = form.cleaned_data['rating']
                    data.look_colour = form.cleaned_data['look_colour']
                    data.ip = request.META.get('REMOTE_ADDR')
                    data.product_id = product_id
                    data.user_id = request.user.id
                    data.save()
                    messages.success(request, 'Thank you! Your review has been submitted.')
                    return redirect('home')

шаблон

<form action="{% url 'ElderFlowerReview' product.id%}" method="POST">
                {%csrf_token%}
                <h4>Look</h4>
                <h5>Colour</h5>
                <select name="look_colour" rows="4" class="form-control"></select>
               

    </form>

На случай, если кто-то столкнется с такой же проблемой, я вроде как нашел решение. (это создает новые проблемы, но это начало).

Вот что я сделал.

Я установил fieldsets (это та часть, которую я пропустил в других сообщениях)

pip install django-forms-fieldset

Я добавил наборы полей в установленные приложения (в setting.py)

INSTALLED_APPS = [
,
    'forms_fieldset']

в forms.py Наборы полей должны быть добавлены до Meta

class ElderFlowerChampFormAdmin(ModelForm):
    fieldsets=[
            ("Look",{'fields':[
            ('look_colour','look_clarity','look_effervescence')]}),
          ]
    class Meta:
        model = ChampageRating
        fields = ('user','look_colour', ..)
        
        labels ={
            'user': '',
            'product': '',
            'look_colour': '',
        }
        widgets = {
                    'user': forms.Select(attrs={'class':'form-control'}),
                    'look_colour':forms.Select(attrs={'class':'form-control'}),
                }

тогда в шаблоне

  <form  action="{% url '#' product.id%}"method = POST>
    {%csrf_token%}
    {{ form|fieldset}}
    <button class="btn btn-secondary">Add Review</button>
  </form>

Новая проблема, которую он создает сейчас, это новый формат HTML, который мне не очень нравится.

Вернуться на верх