在Django中保持选中复选框的状态

1 投票
2 回答
1840 浏览
提问于 2025-04-19 20:25

我想在提交表单后保留表单里的内容。除了选中的复选框外,我可以保留所有其他字段。

这是我的表单操作视图

def student_submit_info(request):
    form_values = {}
    if request.method == 'POST':
        form = StudentForm(request.POST)
        print form.is_valid()
        form_values = getDetails(request)
        if form.is_valid():
            print request.user.username
            student = Student.objects.get(user=request.user)
            // saving student to DB
            saveDetails(request, student, form_values)
    return render_to_response('student.html', form_values, context_instance=RequestContext(request))

def getDetails(request):
  #fetch input data
   form_values = {}
   form_values['first_name'] = request.POST['first_name']
   form_values['last_name'] = request.POST['last_name']
   form_values['skills'] = request.POST.getlist('skills[]')
   return form_values

我想保留技能(复选框),这是我的模板的一部分:

skill1<input type="checkbox" name="skills[]" checked value="skill1"/>
skill2<input type="checkbox" name="skills[]" value="skill2"/>
skill3<input type="checkbox" name="skills[]" value="skill3"/>

2 个回答

0

也许可以使用类视图(CBV)和模型表单(ModelForms)来简化这个过程。把一个列表视图(listview)或者类似的东西结合起来,然后通过上下文(context)添加你的表单。

接着在你的类视图的 get_context_data 方法里:

form_values = {}
#Simpler code below for accessing post dictionary
for key, value in self.request.POST.items():
            if value == 'on':
                form_values[key] = value

context = super().get_context_data(**kwargs)
# You need to add form_values to make it accessible in the forms.py
context['form'] = YourFormName(form_values)

然后,在你的 forms.py 文件里(我希望你在用模型表单):

def __init__(self, filters, *args, **kwargs):
        super(YourFormName, self).__init__(*args, **kwargs)
        if len(form_values) > 0: 
            for field_name in self.fields:
                if field_name in filters:
                    self.fields[field_name].widget = forms.CheckboxInput(attrs={'checked': True})

希望这对你有帮助。

1

你应该创建一个自定义的Django表单,这样可以更方便地处理表单,比如在发布视图中使用:

def post_view(request):
    form = MyForm(request.POST)
    if form.is_valid():
        do_something()
    render(request, 'your_temp', {'MyForm': MyForm'})

通过这种方式,表单中的数据将始终是用户发送的内容。你可以重写is_valid()方法来检查技能复选框是否为空。

撰写回答