我的 django 复选框组未收到有效值,我该怎么办?

问题描述 投票:0回答:1

我是 django 新手,只是因为我正在做的一个学生项目而深入研究,这个复选框有一个问题,我不明白......

 <div class="form-group">
                <label>4 - Deficiência do Participante: <span>*</span></label>
                <div class="checkbox-group">
                    {% for disability in form.participant_disability %}
                    <div class="form-check">
                        {{ disability }}
                        
                    </div>
                    {% endfor %}
                </div>
            </div>

我尝试搜索、删除、更改,但没有任何效果,这里是 forms.py、models.py 和views.py

模型.py

from django.db import models
from .choices import PARTICIPANT_DISABILITY_CHOICES
class Disability(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class ParticipantResponse(models.Model):
    

    PARTICIPANT_DISABILITY_CHOICES = [
    ('auditiva', 'Deficiência Auditiva'),
    ('fisica', 'Deficiência Física'),
    ('intelectual', 'Deficiência Intelectual'),
    ('visual', 'Deficiência Visual'),
    ('autista', 'Transtorno Espectro Autista'),
    # Add more options as needed
]


   
    participant_disability = models.CharField(max_length=255, choices=PARTICIPANT_DISABILITY_CHOICES, default=[''])
   
    def __str__(self):
        return f"Response for {self.participant_name}"

views.py

from django.shortcuts import render, redirect
from .forms import ParticipantResponseForm
from .models import ParticipantResponse

def form_view(request):
    if request.method == 'POST':
        form = ParticipantResponseForm(request.POST)
        if form.is_valid():
            # Convert selected disability choices to integers
            form.cleaned_data['participant_disability'] = [int(choice) for choice in form.cleaned_data['participant_disability']]

            # Save the form data without committing to the database
            response = form.save(commit=False)

            # Assign the disability choices to the response object
            response.participant_disability.set(form.cleaned_data['participant_disability'])

            # Save the response object to the database
            response.save()

            return redirect('responses')
        else:
            print(form.errors)
            print(request.POST)
    else:
        form = ParticipantResponseForm()

    return render(request, 'form.html', {'form': form})

def show_responses(request):
    responses = ParticipantResponse.objects.all()
    print(responses)
    return render(request, 'responses.html', {'responses': responses})

表格.py

from django import forms
from .choices import PARTICIPANT_DISABILITY_CHOICES
from .models import ParticipantResponse, Disability

class ParticipantResponseForm(forms.ModelForm):

    PARTICIPANT_DISABILITY_CHOICES = [(str(disability.id), disability.name) for disability in Disability.objects.all()]
    
    
    participant_disability = forms.MultipleChoiceField(
        choices=PARTICIPANT_DISABILITY_CHOICES,
        widget=forms.CheckboxSelectMultiple,
        required=True,
        label='4 - Deficiência do Participante'
    )


    class Meta:
        model = ParticipantResponse
        exclude = []
        fields = '__all__'
        widgets = {
            'birth_date': forms.DateInput(attrs={'type': 'date', 'class': 'w3-input', 'id': 'id_birth_date'}),
        }

    def __init__(self, *args, **kwargs):
        super(ParticipantResponseForm, self).__init__(*args, **kwargs)
        self.fields['participant_disability'].choices = PARTICIPANT_DISABILITY_CHOICES

如果您能帮助我,我将不胜感激。

django-models django-rest-framework checkbox django-views django-forms
1个回答
0
投票

您的代码中存在多个问题。

首先,在

forms.py
您的
ParticipantResponseForm
初始化中,您动态设置participant_disability的选择:

PARTICIPANT_DISABILITY_CHOICES = [(str(disability.id), disability.name) for disability in Disability.objects.all()]

这是正确的,但它依赖于数据库中已存在的

Disability
对象。如果“残疾”表中没有任何条目,您的选择将为空。

其次,您正在使用

MultipleChoiceField
CheckboxSelectMultiple
小部件。这是处理多个复选框的正确方法。但是,您的模型字段
participant_disability
是一个
CharField
,与用户选择的多个选项不一致。对于多项选择,
ManyToManyField
会更合适,或者您需要将选项列表作为
CharField
中的单个字符串进行处理。

另一个是,在您的

form_view
函数中,尝试将残疾选项转换为整数,然后使用
response.participant_disability.set(...)
设置它们。这是不必要的,也不会起作用,因为
participant_disability
CharField
。这段代码看起来就像
participant_disability
ManyToManyField

我的主要建议是将

participant_disability
模型中的
ParticipantResponse
字段更改为引用
ManyToManyField
模型的
Disability
,或者通过将所选选项连接/拆分为单个字符串来正确处理
CharField

© www.soinside.com 2019 - 2024. All rights reserved.