1

ここで何が起こっているのかわかりません: Django Docs の ContactForm の例に従って、非常に単純な Django フォームを実装していると思いました (ただし、forms.py には別の例を使用しました)。ただし、何らかの理由で、ページが読み込まれるとテンプレートを取得しますが、フォームが表示されません。すべての HTML はテンプレートどおりにありますが、Django のもの (theTest追加したフォームと変数) はレンダリングされません。

どこかに特定できない合併症があることを半分望んでいますが、n00bエラーを発生させてしまったのではないかと心配しています......

誰かが私を助けることができれば、本当に感謝しています!

私のコード:

フォーム.py:

class ContactSupportForm(forms.Form):
    fields = ('theSubject', 'theMessage')
    widgets = {
        'theMessage': forms.Textarea(attrs={'cols': 55, 'rows': 12}),
        }
    error_css_class = 'error'
    required_css_class = 'required'

ビュー.py:

from forms import ContactSupportForm

@login_required
def postSupportMessage(theRequest):
"""The new view to which the support form is submitted"""
isLoggedIn = linfiniti.isUserLoggedIn(theRequest)
if isLoggedIn == True:
    myRequestingUser = theRequest.user
    myRequestingUserEmail = myRequestingUser.email
else:
    return HttpResponseForbidden()
if theRequest.POST:
    theForm = ContactSupportForm(theRequest.POST)
    if theForm.is_valid():
        theIssueSummary = theForm.cleaned_data['theSubject']
        theMessageDesc = theForm.cleaned_data['theMessage']
        theIssueDesc = '%s \n \n Username: %s \n \n User Email: %s' % \
            (theMessageDesc, myRequestingUser, myRequestingUserEmail)
        theIssue = json.dumps({
            "fields": {
                "project":
                      {
                      "key": "SUPPORT"
                      },
                "summary": theIssueSummary,
                "description": theIssueDesc,
                "issuetype": {
                     "name": "Bug"
                    }
                }
          })
        myRequest = urllib2.Request('http://MYURL')
        myAuthString = base64.standard_b64encode('%s:%s' % ('USERNAME', 'PASSWORD'))
        myRequest.add_header("Authorization", "Basic %s" % myAuthString)
        theResult = urllib2.urlopen(myRequest, theIssue, {'Content-Type': 'application/json'})
        myReturn = theResult.read()
        if myReturn:
            theNewKey = myReturn.key
            return HttpResponse(json.dumps({
                "success": True,
                "theNewKey": theNewKey
                }))
        else:
            return HttpResponse(json.dumps({
                "success": False
                }))
    else:
        theForm = ContactSupportForm()
        theTest = 'crap'
else:
    theForm = ContactSupportForm()
    theTest = 'rubbish'

return render_to_response('contact-support.html',
                                     {
                                     'theForm': theForm,
                                     'test': theTest
                                     },
                                     context_instance=RequestContext(theRequest)
                                     )

HTML:

<h5>Contact Support</h5>
      <div class="buttons" id="reload-support-form">
        <a data-ignore="true" class="btn btn-mini" href="javascript:void(null);" id="show-sent" onClick="reLoadSupportForm();">
          <i class="icon-refresh"></i> Reload Form
        </a>
      </div>
    </div>
    <h1>{{test}}</h1>
    <div class="widget-content" id="support-message-container">
      <div id="message-support-content">
        <form action="" method="post" id="compose-message-form" class="form-horizontal">

{% csrf_token %}
{% for field in theForm %}
  <fieldset class="control-group {% if field.errors %}error{% endif %}">
    <label class="control-label" for="{{ field.auto_id }}">{{ field.label }}</label>
    <div class="controls">
      {{ field }}
      {% if field.help_text %}
        <span class="help-inline">{{ field.help_text }}</span>
      {% endif %}
      {% if field.errors %}
        <span class="help-inline">{{ field.errors|striptags }}</span>
      {% endif %}
    </div>
  </fieldset>
{% endfor %}
<div class="control-group">
  <div class="controls">
    <input id="support-message-submit" class="btn btn-primary" type="submit"/>
  </div>
</div>

編集

以下の回答/コメントに従って、forms.pyを更新しましelseた(ビューから2番目も削除しました):

class ContactSupportForm(forms.Form):
theSubject = forms.CharField(max_length=100)
theMessage = forms.CharField(widget=forms.Textarea(attrs={'cols': 55, 'rows': 12}))
error_css_class = 'error'
required_css_class = 'required'

ただし、私はまだテンプレートにフォームを取得theTestしておらず、テンプレートにも取得していません。ビューはテンプレートを正しく返しますが、フォームまたは を返しませんtheTest

4

1 に答える 1

1

Aamir が指摘しているように、フォームにフィールドを定義しておらず、この方法でそれを実行するアイデアをどこから得たのかが明確ではありません。ドキュメントには、何をすべきかが明確に示されています。

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField(widget=forms.Textarea(attrs={'cols': 55, 'rows': 12}))
    error_css_class = 'error'
    required_css_class = 'required'

および属性はwidgetsfieldsモデルから生成されたフォームである ModelForms の内部 Meta クラスでのみ使用され、そのモデルのフィールドのデフォルト フィールド/ウィジェットをオーバーライドする必要があります。あなたはここでそれをしていないので、意味がありません。

また、ビューでは、2 番目のelse句を削除する必要があります。これにより、検証エラーが発生したときにフォームが再インスタンス化されるため、エラーは HTML ページに表示されません。その句を削除すると、render_to_response 呼び出しまで実行を直接ドロップできます。

(変数名に関しては、camelCase の問題は別として、変数theの半分にmy.

于 2013-01-05T11:19:59.627 に答える