【问题标题】:Web server ini-file editor using django使用 django 的 Web 服务器 ini 文件编辑器
【发布时间】:2012-06-12 06:59:52
【问题描述】:

我想通过网络服务器编辑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 的某种控制器,模板是视图,模型是我的 ini 文件(可能使用 django 模型与 db 链接),或者我得到有事吗?

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

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

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

更新(2012 年 6 月 11 日): 我的代码如下所示: 视图.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

settings.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 数据?

【问题讨论】:

  • 你看过django forms吗?它们将提供一种简单的方法来在模板中呈现表单并将数据获取到 views.py
  • 我做到了,但正如您所见,如果我以正确的方式执行此操作,我很难理解。我可以根据需要从我的settingsDict 创建包含多个CharField() 的表单,可以吗?仍然不明白如何将所有CharField() 编辑发布回views.py,以便我可以编辑.ini 文件。
  • 是的,至少作为第一步。如果某些值不仅是通用文本,那么当您开始工作时,也可能值得查看其他表单字段。
  • 还有一个问题,小部件属性名称显示在模板中。如何动态创建 CharField() 显示字典中的文本?明白了:forms.CharField(label='label name')
  • 简直想不通。我创建了我的 DynamicForm,它接受 kwargs 参数并根据需要创建尽可能多的 CharFields。但无法让表单绑定到 POST 请求。

标签: python django ini


【解决方案1】:

好的,终于想通了,花了我很多时间(我缺乏很多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。表单变得未绑定,您将无法在 request.POST 方法中解析数据。未绑定的表单(并且有错误)将始终返回 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 文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多