我是 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
如果您能帮助我,我将不胜感激。
您的代码中存在多个问题。
首先,在
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
。