Skip to main content
 首页 » 编程设计

python之使用 django 的 Web 服务器 ini 文件编辑器

2025年05月04日35fff_TT

我想通过网络服务器编辑 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 file parser .

我无法理解如何在 Django 中正确开发:views.py是 django 的某种 Controller ,模板是 View ,模型是我的 ini 文件(可能使用 django 模型与 db 链接),或者我弄错了什么?

我可以毫无问题地将这个字典传递给模板,在其中创建一个 for 循环并创建 html 标签,例如:<input type="text" name={{ property }} value={{ value }} maxlength="100" /> .但是我如何将所有编辑后的值发回控件以将它们保存在文件(或数据库)中?我需要所有 3 个值,即 GROUP, PROPERTY and VALUE .

然后我发现 django 也有 html 小部件,您可以在 views.py 中创建这些小部件然后将其传递给模板。但这是我停止理解事物的地方,因为我在我的 Controller 类中创建小部件,但即使我是。

我应该创建一个包含所有 Django 小部件的列表并将其传递给模板吗?出现同样的问题,如何将所有小部件值返回到 Controller (views.py)?

更新(2012 年 6 月 11 日): 我的代码如下所示: View .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 所以我无法获取字段值。我的 request.POST 是正确的,包含所有字段和值。据我所知,我不应该“手动”解析 request.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。表单变得未绑定(bind),您将无法在 request.POST 方法中解析数据。未绑定(bind)的表单(以及有错误的)将始终返回 is_valid() False。

使用这个类,您可以毫无问题地解析request.POST 数据。循环动态表单字段如下所示:

View 
for name,field in form.fields.items(): 
    # name - field name 
    # form.data[name] - field value 

注意事项:

模板代码循环遍历表单中的字段,显示字段标签和用 分隔的值:

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 文档。