Python Django-将初始值传递到绑定形式

Python Django-将初始值传递到绑定形式,django,Django,我是PythonDjango的新手,我正在尝试设置一个包含三个字段的绑定表单,其中一个字段(将是只读的)获取初始值并显示在表单上;其他两个字段将由用户在填写表单时填充。但是当我试图提交表单时,form.is_valid返回false,我不确定我做错了什么。有人能帮忙吗 谢谢 代码如下: views.py class AddKeyAccompView(TemplateView): template_name = 'AddKeyAccomp.html' def get(self,

我是PythonDjango的新手,我正在尝试设置一个包含三个字段的绑定表单,其中一个字段(将是只读的)获取初始值并显示在表单上;其他两个字段将由用户在填写表单时填充。但是当我试图提交表单时,form.is_valid返回false,我不确定我做错了什么。有人能帮忙吗

谢谢

代码如下:

views.py

class AddKeyAccompView(TemplateView):
    template_name = 'AddKeyAccomp.html'

    def get(self, request, Program):
        username = request.user.username
        form = AddKeyAccompForm(request, Program=Program)
        return render(request, self.template_name, {'form': form
                                                    ,'title':'Add New Key Accomplishment'
                                                    ,'User': username
                                                    })

    def post(self, request, Program):
        username = request.user.username
        form = AddKeyAccompForm(request.POST, Program=Program)
        if form.is_valid():
            Name = form.cleaned_data['Name']
            Description = form.cleaned_data['Description']
            form.save()
            form = AddKeyAccompForm(request, Program=Program)
            return HttpResponseRedirect(reverse('ModInit', args=[Program]))
        else:
            return HttpResponse('invalid form')
        args = {'form': form
                ,'title':'Add New Key Accomplishment'
                ,'User': username
                ,'Name': Name
                ,'Desc': Description
                ,'Program': Program
                }
        return render(request, self.template_name, args)
forms.py

class AddKeyAccompForm(forms.ModelForm):
    def __init__(self, request, *args, **kwargs):
        self.program = kwargs.pop('Program')
        super(AddKeyAccompForm, self).__init__(*args, **kwargs)
        self.fields['Program'].initial = self.program

    class Meta:
        model = Key_Accomplishments
        fields = ('Name', 'Description', 'Program',)
        widgets = {
                    'Name': forms.TextInput(attrs={'required':True, 'class':'form-control'})
                    ,'Description': forms.Textarea(attrs={'required': True, 'class':'form-control'})
                    ,'Program': forms.TextInput(attrs={'readonly':'readonly', 'class':'form-control'})
        }
html文件

{% extends 'base.html' %}

<!DOCTYPE html>
<html>
<head>
    {% block head %}
    <title>New Key Accomplishment</title>
    {% endblock %}
</head>
<body>
    {% block body %}
    <div class="container">
        <ol class="breadcrumb my-4">
            <li class="breadcrumb-item active">
                <center>{{ title }}</center>
            </li>
        </ol>
    </div>
    <br>
    <div class="offset-3 col-md-6">
        <form method="post">
            {% csrf_token %}
            <div class="form-group" style="padding-left:10%;">
                {% for field in form %}
                <label>{{ field.label_tag }}</label>
                {{ field }}
                <br>
                {% endfor %}
            </div>
            <div class="btn" style="padding-left: 10%;">
                <button type="submit">Submit</button>
            </div>
        </form>
    </div>
    {% endblock %}
</body>
</html>
{%extends'base.html%}
{%block head%}
新的关键成就
{%endblock%}
{%block body%}
  • {{title}}

  • {%csrf_令牌%} {%形式的字段为%} {{field.label_tag} {{field}}
    {%endfor%} 提交 {%endblock%}
    您已将表单init方法的签名更改为接受
    请求
    。不要那样做。无论如何,你们并没有使用它。但你们也不需要像那个样传递程序;为什么不干脆
    form=AddKeyAccompForm(initial={'Program':Program})
    ?嗨,丹尼尔,我以前有过这种情况,我得到了以下错误:在/AddKeyAccomp/Cybersecurity Program'Program'上的keyrerror。错误似乎来自form=AddKeyAccompForm(initial={'Program':Program})和self.Program=kwargs.pop('Program')是的,正如我所说,您不需要对kwargs执行任何操作。完全删除
    \uuuu init\uuuu
    方法。谢谢Daniel。现在就开始工作。