0

私はホームページの一番下に連絡先フォームを埋め込む必要があります。これは1ページのアプリケーションです。私は成功した別のページ(myportfolio.com/contactなど)に自分自身の連絡先フォームを作成する方法についていくつかのチュートリアルを続けました。残念ながら、私はこれらの結果を適合させることができず、他のチュートリアルを見つけることもできませんでした。私の他のモデルデータ(例えば、myportfolio.com)がすべて同じページに表示され、機能します。ホームページ上のDjango連絡フォーム

このチュートリアルは、https://atsoftware.de/2015/02/django-contact-form-full-tutorial-custom-example-in-django-1-7に従っています。私は1つのアプリケーションしか作成していません。

私はこれがやりたいことは非常に一般的なものでなければならないと感じています。それは私が何か目立つようなものを見落としていると思います。このようなアプリケーションで

views.py

from django.views.generic import TemplateView 
from portfolio.models import Experience 

class HomePage(TemplateView): 
    template_name = 'portfolio/base.html' 

    def get_context_data(self, *args, **kwargs): 
     context = super(HomePage, self).get_context_data(*args, **kwargs) 
     context['experience_list'] = Experience.objects.order_by('-start_date') 

     return context 

contact_form.html

{% extends 'portfolio/base.html' %} 

{% block contact %} 

    <form method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Submit"> 
    </form> 

{% endblock %} 

今すぐcontact_form.htmlポートフォリオに入る/ base.html:

base.html

{# {% include "contact_form/contact_form.html" %}#} 
{% block contact %}{% endblock %} 

このシナリオでは、何も表示されません。ただし、2行目をコメントアウトして1行目のコメントを削除すると、送信ボタンが表示されます。

今、私はdjango-contact-formがこのフォームを手に入れ、myportflio.com/contactのシナリオでアクセス可能なときのように何をするべきかを知っていると仮定しています。しかし、以前はurls.pyファイルを使って/ contactへの参照があったことは分かっていますが、base.htmlファイルに埋め込む場合は参照がなくなりました。

コンテキストにモデルデータを追加するのと同じように、HompePageビューに何らかの方法でフォームを追加できますか?

+0

あなたのメインページにフォームを追加して、モーダルとjquery/bootstrap *スーパーシンプルハックでロードしてください – Thomas

+0

あなたのviews.pyとテンプレートのフォームを宣言したHTML部分を表示してください – hansTheFranz

+0

@hansTheFranzちょうどそれらといくつかのエキストラを追加しました。 – grantathon

答えて

2

あなたが従っているチュートリアルは実際には最新ではありません(1.7で書かれています)。ですから、あなたが通常views.py(そしてあなたの関数に欠けているもの)で行うことは、フォームを宣言することです。

私はあなたのコードと少し違っていますが、あなたのコードとは少し違っていますが、私の意見では分かりやすく、標準的な方法のようです。

from appName.forms import formName #dont forget to import the form 
from django.views.generic import TemplateView 
from portfolio.models import Experience 


def HomePage(request): 
    form = formName(request.POST or None) #here you tell django what form you are talking about 
    if form.is_valid(): #checking if the form input is valid 
    .... 
    form.save() 
    #messages.success(request, 'form was posted') #this is optional but good for the user 
    context = { 
    'form': form, #here you are passing the variable "form" to the template so you can use it like "{{form.as_p}}" 
    'experience_list' = Experience.objects.order_by('-start_date') 
    #other context variables 
    } 
    return render(request, "appName/MainPage.html", context) 

Appであなたのurls.pyは次のようになります。あなたはそれがこのしようとする方法をすべて保存しておきたい場合は

urlpatterns = [ 
    url(r'mainPage',views.HomePage, name='HomePage'), 
] 

def get_context_data(self, *args, **kwargs): 
    context = super(HomePage, self).get_context_data(*args, **kwargs) 
    context['experience_list'] = Experience.objects.order_by('-start_date') #maybe you have to put a "," here but I'm not sure 
    context['form'] = formName 

    return context 

を私はよく分かりません一般的なTemplateViewでこのような検証を行う方法。とにかく "フォーム"変数を宣言してから、それはテンプレートに表示されるはずです。

+0

両方の方法が完全に機能しました。ご協力いただきありがとうございます。 – grantathon

+1

私はすべてを書き直してから最初は少し怖かったし、通常は内部にバグがあります。そして人々がちょうどDjangoで始まったとき、彼らは何が間違っているのか理解できません。あなたがそれを働かせることができてうれしい:) – hansTheFranz

関連する問題