簡體   English   中英

使用django的Web服務器ini文件編輯器

[英]Web server ini-file editor using django

我希望通過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模型與db鏈接),還是我出了點問題?

我毫不費力地將此字典傳遞給模板,在其中進行for循環並創建html標簽,例如: <input type="text" name={{ property }} value={{ value }} maxlength="100" /> 但是,然后我該如何將所有編輯后的值發回控制以將它們保存在文件(或數據庫)中呢? 我將需要所有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

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數據嗎?

好的,終於弄清楚了,這花了我很多時間(我缺少很多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

關於此代碼的注釋:

  • 如果form不使用super(SuperForm, self).__init__(*args, **kwargs) ,則必須使用forms.Form.__init__(self,*k,**kw)以便可以使用self將字段附加到form .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文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM