我希望通过Web服务器编辑ini文件,决定使用django,现在已经使用它几天了。我不知道如何做到这一点。我有如下所示的ini文件结构:
{'GROUP', {PROPERTY : VALUE}}
我读取这种 ini 文件的示例:
[LOG]
FilePath = C:/Log
[CMD]
Level = 5
我将像这样填充我的数据结构:
{'LOG', {'FilePath' : 'C:/Log',},
{'CMD', {'Level', '5'}}}
循环如下所示:
for group in settingsDict:
print group # group
for property in settingsDict[group]:
print property , # property
print settingsDict[group][property] # value
我正在使用 ini 文件解析器。
我无法理解如何在 django 中正确开发:views.py
是 django 的某种控制器,模板是视图和模型将是我的 ini 文件(可能与使用 django 模型的数据库链接),还是我弄错了什么?
我将这个字典传递给模板,在其中制作一个 for 循环并创建 html 标签,例如:<input type="text" name={{ property }} value={{ value }} maxlength="100" />
.但是,我如何将所有编辑后的值发布回控件以将它们保存在文件(或 db)中?我需要所有 3 个值,即GROUP, PROPERTY and VALUE
.
然后我发现 django 也有 html 小部件,你可以在views.py
中创建,然后将其传递给模板。但这就是我停止理解事物的地方,因为我正在我的控制器类中创建小部件,但即使我是。
我应该创建一个所有 django 小部件的列表并将其传递给模板吗?出现同样的问题,如何将所有小部件值返回控制器 (views.py)?
更新 (11.6.2012):我的代码如下所示:views.py
class DynForm(forms.Form):
def setFields(self, kwds):
keys = kwds.keys()
keys.sort()
for k in keys:
self.fields[k] = kwds[k]
def settings(request):
global Settings #my ini dict
kwargs = {}
for group in Settings:
for property in Settings[group]:
kwargs[property] = forms.CharField(label = property, initial = Settings[group][property])
f = DynForm()
f.setFields(kwargs)
return render_to_response('/settings.html',
{
'textWidget' : f,
})
@csrf_exempt
def save(request):
if request.method == 'POST': # If the form has been submitted...
form = DynForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
# process form data
# and return response
设置.html
<form action="/save/" method="post">
{% csrf_token %}
{% for field in textWidget %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label }}: {{ field }}
</div>
{% endfor %}
<p><input type="submit" value="Save" /></p>
</form>
问题是,DynForm(request.POST)
返回 null,所以我无法获取字段值。我的要求。POST 正确,包含所有字段和值。据我所知,我不应该解析请求。"手动"发布数据?
好吧,终于想通了,花了我很多时间(我缺乏很多 python 和 django 知识)。由于版权权限,我无法粘贴最终解决方案,这是概念:
Form
class DynamicForm(forms.Form):
def __init__(self,*k,**kw):
forms.Form.__init__(self,*k,**kw)
# loop over data from **kw
# create field
# set field default value
有关此代码的说明:
- 如果表单不使用
super(SuperForm, self).__init__(*args, **kwargs)
,则必须使用forms.Form.__init__(self,*k,**kw)
,以便可以使用 self.fields 属性将字段附加到表单。 - 如果需要使用默认字段值,请使用
self.data[field] = defVal
而不是initial = defVal
。表单将变为未绑定状态,您将无法分析请求中的数据。开机自检方法。未绑定的形式(并且有错误)将始终返回is_valid() False
.
使用此类,分析request.POST
数据不会有问题。循环动态表单字段如下所示:
View
for name,field in form.fields.items():
# name - field name
# form.data[name] - field value
笔记:
- 为简单起见,请在 POST 方法之前使用 @csrf_exempt 标记。见 http://jordanmessina.com/2010/05/24/django-1-2-csrf-verification-failed/
模板代码循环访问表单中的字段,显示字段标签和用:
分隔的值
Template
<form action="/Tris/save/" method="post">
{% csrf_token %}
{% for field in textWidget %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.non_field_errors }}
{{ field.label }}: {{ field }}
</div>
{% endfor %}
<p><input type="submit" value="Save" /></p>
</form>
大部分解决方案都来自这里:http://jacobian.org/writing/dynamic-form-generation/和 django 文档。