django-models - Django:如何在模型的 clean 方法中获取动态添加的表单字段
问题描述
我对 Django 很陌生。以下是我想要实现的目标
我根据从视图中获得的模型 (configurable_product_options_model) 在表单上动态添加一些字段。我的想法是利用这些动态添加的字段来创建激活记录(ActivationRecord (models.Model))。我无法在我的模型 ActivationRecord 的 clean 函数中获取这些字段(其中没有一个映射到我的模型中的数据字段[显然])来创建一些保存在数据库中的条目。
看法
def activation_record(request):
configurable_product_options_modeltouse = None
product_options_modeltouse = None
if request.session['feature_name'] == "M-Vault" :
product_options_modeltouse = MLink_Product_Options
configurable_product_options_modeltouse = MLink_Configurable_Product_Options
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
feature = request.session['feature_name']
form = ActivationRecordForm (request.POST, product_options_model = product_options_modeltouse,
configurable_product_options_model = configurable_product_options_modeltouse)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
# redirect to a new URL:
form.save()
return redirect('/admin/sales_portal/activationrequest/')
# if a GET (or any other method) we'll create a blank form
else:
form = ActivationRecordForm(initial={'feature_name' : request.session['feature_name'],
'customer_reference' : request.session['customer_reference'],
'host_method' : request.session['host_method'],
'host_id' : request.session['host_id'],
'activation_type' : request.session['activation_type']},
product_options_model = product_options_modeltouse,
configurable_product_options_model = configurable_product_options_modeltouse)
# Disabled the populatd fieds in the ISODE activation record form
form.fields['host_id'].widget.attrs['readonly'] = True
return render(request, 'sales_portal/activation_record.html', {'form': form})
形式
class ActivationRecordForm (ModelForm) :
def __init__(self, *args, **kwargs) :
# Populate product options from the model based on the feature in the activation request
product_options_model = kwargs.pop('product_options_model')
configurable_product_options_model = kwargs.pop('configurable_product_options_model')
super(ActivationRecordForm, self).__init__(*args, **kwargs)
# Add product options in the form
if product_options_model :
self.fields['sub_feature'] = forms.ModelMultipleChoiceField(label='Product Options ',
required=False,
queryset = product_options_model.objects.all())
# Add configurable product options in the form
if configurable_product_options_model :
queryset = configurable_product_options_model.objects.all()
for configurable_product_options in queryset :
name = "%s " % configurable_product_options
self.fields[name] = forms.CharField(required=False,
widget=forms.TextInput(attrs={'id':'CONFIGURABLE_PRODUCT_OPTION'}))
在 ActivationRecord 模型的 clean 函数中,我想利用这些动态添加的字段(“%s” %configurable_product_options)中填充的数据。我正在尝试自己弄清楚(我相信一定有一种非常简单的方法可以做到这一点,但如果有人能给我提示,我将不胜感激)。尝试了 get_fields() 但它没有列出表单上动态添加的字段。
class ActivationRecord (models.Model) :
def clean (self) :
fields = self._meta.get_fields()
解决方案
我意识到正确的方法(也许)不在模型中,而是在我看来。想法是在不保存表单(commit=False)的情况下获取模型对象,然后在再次保存之前根据可配置参数对其进行修改。
if request.method == 'POST':
feature = request.session['feature_name']
form = ActivationRecordForm (request.POST, product_options_model = product_options_modeltouse,
configurable_product_options_model = configurable_product_options_modeltouse)
# check whether it's valid:
if form.is_valid():
queryset = configurable_product_options_modeltouse.objects.all()
product_options = []
for configurable_product_options in queryset :
if form.cleaned_data["%s " % configurable_product_options] :
val = str(configurable_product_options) # Get the label
val = val.replace(" ", "") # Remove spaces from the label
val = val.lower() # Make the label lowercase
val = val+"="+str(form.cleaned_data["%s " % configurable_product_options])
product_options.append(val)
# modify the activation record with the configurable product options before
# saving the form and redirecting to a new URL:
if product_options :
activation_record_object = form.save(commit=False)
activation_record_object.sub_feature = str(activation_record_object.sub_feature)+ "," + ",".join(product_options)
form.save()
推荐阅读
- javascript - 创建第二个 jsPanel 时显示隐藏的 jsPanel
- java - tomcat 上缺少验证器
- sql - 为什么要在设置 TRANSACTION ISOLATION LEVEL SNAPSHOT 之前检查 TRANCOUNT
- jenkins - Jenkins Linux master 和 Jenkins windows server 2019 slave 之间的连接问题
- java - 对 json 文件进行排序
- c# - 无法加载程序集“CommonBaseData”。确保它被启动项目“CommonBaseType”引用
- c# - 如何将 TempData 传递给我的 _Layout.cshtml 视图
- html - 浏览器如何连接 html 类名和 css 样式条目?
- ajax - 通过 XmlHttpRequest 或 Ajax 发送消息信息
- magento - 如何在 Magento 2 的产品网格中的自定义批量操作下创建弹出窗口?