首页 > 解决方案 > Django表单动态下拉列表创建

问题描述

模型.py

在此处创建您的模型。

class DeviceType(models.Model):
    device_type = models.CharField(max_length=200,unique=True)

class Repair(models.Model):
    device_type                     = models.ForeignKey(DeviceType,to_field='device_type')
    submitted_by                    = models.ForeignKey(User,to_field='username')
    comments                        = models.TextField()
    repair_request_date             = models.DateField(default=datetime.now)
    repair_status                   = models.ForeignKey(RepairStatus, to_field="repair_status", null=True)
    repair_cost_estimate            = models.FloatField(null=True)

视图.py

def repair_form(request):
    dlist = get_my_choices(request.user)
    if request.method == "POST":
        form = RepairForm(request.POST,device_type = dlist, submitted_by = request.user)
        #print(form)
        if form.is_valid():
            print("Inside repair form")
            post = form.save(commit=False)
            post.submitted_by = request.user
            print(post.pk)
            post.save()
            return redirect("RepairRequest")
    else:
        dlist = get_my_choices(request.user)
        print("Inside else of repair form")
        form = RepairForm( device_type = dlist, submitted_by = request.user)
        print("else form: ", form)
        return render(request, "Form_template.html", {"form": form,\
                                                      "name": "Repair Request Form"})

表格.py

class RepairForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        print("kwargs: ",kwargs)
        dlist = kwargs["device_type"]
        print("Inside init of RequestForm")
        super(RepairForm, self).__init__(*args, **kwargs)
        self.fields["device_type"] = forms.ChoiceField(choice = [dlist])
        self.fields["submitted_by"] = kwargs["submitted_by"]



    class Meta:
        print("Inside Meta of RepairForm")
        model = Repair
        print("model: ", model)
        fields = "__all__"
        print("fields: ", fields)
        exclude = ("repair_cost_estimate","repair_status","submitted_by","repair_request_date",)

我正在尝试在 django 表单中创建一个动态下拉列表。从下拉列表将仅填充与给定用户关联的数据的意义上说是动态的。就我而言,每个用户都可能随身携带一台笔记本电脑、鼠标等。我已经编写了上面显示的代码。每次执行代码时,都会出现以下错误:

TypeError at /user_dashboard/RepairRequest.html
__init__() got an unexpected keyword argument 'submitted_by'
Request Method: GET
Request URL:    http://127.0.0.1:8000/user_dashboard/RepairRequest.html
Django Version: 1.11.13
Exception Type: TypeError
Exception Value:    
__init__() got an unexpected keyword argument 'submitted_by'
Exception Location: E:\inventory management\inventory_management_service\inventory_management_app\forms.py in __init__, line 15
Python Executable:  C:\Anaconda2\python.exe
Python Version: 2.7.14
Python Path:    
['E:\\inventory management\\inventory_management_service',
 'C:\\Anaconda2\\python27.zip',
 'C:\\Anaconda2\\DLLs',
 'C:\\Anaconda2\\lib',
 'C:\\Anaconda2\\lib\\plat-win',
 'C:\\Anaconda2\\lib\\lib-tk',
 'C:\\Anaconda2',
 'C:\\Users\\Jaimik Jain\\AppData\\Roaming\\Python\\Python27\\site-packages',
 'C:\\Anaconda2\\lib\\site-packages',
 'C:\\Anaconda2\\lib\\site-packages\\win32',
 'C:\\Anaconda2\\lib\\site-packages\\win32\\lib',
 'C:\\Anaconda2\\lib\\site-packages\\Pythonwin',
 'C:\\Anaconda2\\lib\\site-packages\\pywinpty-0.5-py2.7-win-amd64.egg']
Server time:    Thu, 7 Jun 2018 09:56:44 +0000

我尽早请求您的帮助。

标签: djangodjango-modelsdjango-forms

解决方案


问题在于您在这里传递参数submitted_by并传递device_typeRepairForm构造函数。由于您明确提到了这些,这意味着它们存储在kwargs字典中。

但是,在执行呼叫之前,您不要修改此字典。super().__init__(*args, **kwargs)结果,超类ModelForm)也将接收这些参数,但它不知道如何处理这些参数。结果会出错。

因此,您需要从kwargs. 例如.pop(..)

class RepairForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        dlist = kwargs.pop("device_type")
        submitted_by = kwargs.pop("submitted_by")
        super(RepairForm, self).__init__(*args, **kwargs)
        self.fields["device_type"] = forms.ChoiceField(choices=[dlist])
        self.fields["submitted_by"] = submitted_by

您还应该choices=...在初始化 a 时使用 as 参数ChoiceField,而不是choice=....

我认为有多个额外的错误,但我希望这能提供一些好的方向。


推荐阅读