[英]Django how to add an initial value with modelformset_factory?
与modelformset_factory
一起使用时,如何将初始值传递给Product_Form
?
这是我的尝试:
models.py:
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=45)
qty = models.IntegerField()
price = models.IntegerField()
forms.py:
from django import forms
from .models import Product
class ProductForm(forms.BaseModelFormSet):
def __init__(self, *args, **kwargs):
super(Product_Form, self).__init__(*args, **kwargs)
qty = kwargs.get('qty','')
print(qty) #prints blank string
self.queryset = Product.objects.filter(qty=qty)
class Meta:
model = Product
fields = ['name', 'qty', 'price']
views.py:
from django.shortcuts import render
from django.views import View
from django.forms import modelformset_factory
from .forms import Product_Form
from .models import Product
class Inventory(View):
def __init__(self):
pass
def get(self, req):
product_form = modelformset_factory(Product, fields=('qty','price','name'),
formset=Product_Form)
form = product_form(initial=[
{'qty':0},
])
context = {
'form':form,
}
return render(req, 'base.html', context)
我需要传递给它的数据是Search_Form
的结果(IE用户输入),该结果用于过滤Products查询。
当我尝试呈现base.py
,出现以下错误:
以10为底的int()的无效文字:''
这似乎是由于在Product.objects.filter(qty='')
插入了空字符串所致
我直接从文档中获取大部分代码,所以我真的不确定为什么它不起作用。
我在这里想念什么?
改变这个:
form = product_form(initial=[
{'qty':0},
])
对此:
form = product_form(qty=0)
产生一个错误:
init ()获得了意外的关键字参数'qty'
我根据bdoubleu的答案修改了代码,并收到以下错误:
Template error:
In template /Users/jane/Code/mu_env/mu/inventory/templates/partials/product_form.html, error at line 2
__init__() got an unexpected keyword argument 'use_required_attribute'
1 : <form action="/inventory/update" method="POST" id="search_form"> {% csrf_token %}
2 : {{ product_form }}
3 : <button>save</button>
4 : </form>
5 :
Traceback:
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/views/generic/base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/views/generic/base.py" in dispatch
97. return handler(request, *args, **kwargs)
File "/Users/jane/Code/mu_env/mu/inventory/views.py" in get
31. return render(req, 'inventory/base.html', context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/shortcuts.py" in render
36. content = loader.render_to_string(template_name, context, request, using=using)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/loader.py" in render_to_string
62. return template.render(context, request)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/backends/django.py" in render
61. return self.template.render(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in render
171. return self._render(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in _render
163. return self.nodelist.render(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in render
937. bit = node.render_annotated(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in render_annotated
904. return self.render(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/defaulttags.py" in render
309. return nodelist.render(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in render
937. bit = node.render_annotated(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in render_annotated
904. return self.render(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/loader_tags.py" in render
188. return template.render(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in render
173. return self._render(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in _render
163. return self.nodelist.render(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in render
937. bit = node.render_annotated(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in render_annotated
904. return self.render(context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in render
993. return render_value_in_context(output, context)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/template/base.py" in render_value_in_context
972. value = str(value)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/utils/html.py" in <lambda>
388. klass.__str__ = lambda self: mark_safe(klass_str(self))
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/forms/formsets.py" in __str__
64. return self.as_table()
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/forms/formsets.py" in as_table
404. forms = ' '.join(form.as_table() for form in self)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/forms/formsets.py" in __iter__
68. return iter(self.forms)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/utils/functional.py" in __get__
80. res = instance.__dict__[self.name] = self.func(instance)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/forms/formsets.py" in forms
136. for i in range(self.total_form_count())]
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/forms/formsets.py" in <listcomp>
136. for i in range(self.total_form_count())]
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/forms/models.py" in _construct_form
620. form = super()._construct_form(i, **kwargs)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/forms/formsets.py" in _construct_form
172. form = self.form(**defaults)
File "/Users/jane/Code/mu_env/mu/inventory/forms.py" in __init__
31. super(Product_Form, self).__init__(*args, **kwargs)
File "/Users/jane/Code/mu_env/env/lib/python3.7/site-packages/django/forms/models.py" in __init__
569. super().__init__(**{'data': data, 'files': files, 'auto_id': auto_id, 'prefix': prefix, **kwargs})
Exception Type: TypeError at /inventory/search
Exception Value: __init__() got an unexpected keyword argument 'use_required_attribute'
initial
关键字参数用于将初始数据传递给表单,将表单kwargs传递给表单集,您将需要使用form_kwargs
。
form = product_form(form_kwargs={'qty': 0})
值得注意的是,您要完成的操作没有必要将任何多余的参数传递给表单集,因为您可以直接修改queryset 。
为此, ProductForm
应该是Django Form
,而不是BaseModelFormset
。
forms.py
from django import forms
from .models import Product
class ProductForm(forms.Form):
class Meta:
model = Product
fields = ['name', 'qty', 'price']
ProductFormSet = forms.modelformset_factory(Product, form=ProductForm)
因此,将其放到当前视图中:
from .forms import ProductFormSet
class Inventory(View):
def get(self, request, *args, **kwargs):
qty = self.request.GET.get('qty', None)
qs = Product.objects.all()
if qty:
qs = qs.filter(qty=qty)
form = ProductFormSet(queryset=qs)
context = {
'form':form,
}
return render(req, 'base.html', context)
这是使用FormView
的替代版本:
from django.views.generic import FormView
from .forms import ProductFormSet
class Inventory(FormView):
form_class = ProductFormSet
def get_form_kwargs(self)
kwargs = super().get_form_kwargs()
qty = self.request.GET.get('qty', None)
qs = Product.objects.all()
if qty:
qs = qs.filter(qty=qty)
kwargs['queryset'] = qs
return kwargs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.