2

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.pydjangoとテンプレートのある種のコントローラーはビューであり、モデルは私のiniファイル(おそらくdjangoモデルを使用してdbにリンクされています)ですか、それとも何か問題がありますか?

この辞書をテンプレートに渡し、その中に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

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データを「手作業で」解析することは想定されていません。

4

1 に答える 1

0

OK、ついにそれを理解し、私に多くの時間を費やしました(私は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がを使用しない場合は、 self.fields属性を使用してformにフィールドを追加できるようにをsuper(SuperForm, self).__init__(*args, **kwargs)使用する必要があります。forms.Form.__init__(self,*k,**kw)
  • デフォルトのフィールド値を使用する必要がある場合は、self.data[field] = defValnotを使用してください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のドキュメント。

于 2012-06-12T13:40:40.060 に答える