django - 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
我尽早请求您的帮助。
解决方案
问题在于您在这里传递参数submitted_by
并传递device_type
给RepairForm
构造函数。由于您明确提到了这些,这意味着它们存储在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=...
.
我认为有多个额外的错误,但我希望这能提供一些好的方向。
推荐阅读
- java - 如何设置嵌套列表的初始容量?
- list - Haskell:如何将元素列表拆分为多个列表 [a]->[[a]]
- c - 在 C 中断言关键字
- latex - 如何在突出显示的列中对齐 CENTER(水平顶部)的内容?
- python - 使用 strftime 和 strptime 转换时间格式
- java - 为什么 Java 的 Thread.join() 不等待这段代码中的所有线程都死掉?
- arrays - jq - 成对转换数组
- excel - 如何在 VBA 中使单元格“空白”而不是“空”
- android - Jetifier 未正确解析 Play Services 依赖项
- c++ - 在 ubuntu 上使用 eclipse che 运行 c++ 代码的问题