2016-07-17 5 views
0

ログインボックスと投稿フォームがあるページを作成するには、次のチュートリアルのリンクに従っています。django、pythonで 'redirect'と 'message'を使う方法

私がここで達成しようとしているのは、サイトにログインしている人だけが投稿フォームに書き込んでコンテンツを送信できるようにすることです。

https://docs.djangoproject.com/en/1.9/topics/auth/default/

セクション「どのようにユーザーをログに記録する」の下には、上記のリンクに行けば、 は、それは基本的に と '「の成功のページにリダイレクト」

を使用するように私に指示します無効なアカウントエラーメッセージを返す 'と '無効なログインエラーメッセージを返す '

ここでの問題は、私がPythonとDjangoについて学んだのはわずか数日であり、そのような機能が必要になるたびに、私はほとんど何も見つけることができませんそれらの機能を学ぶためのソース、またはコードを入手する。

私は既にGoogleで検索し、「リダイレクト」のためにStackOverflowが、私は得ることができた例はこれだった:

@app.route('/success/<int:result_id>') 
def success(result_id): 
# replace this with a query from whatever database you're using 
result = get_result_from_database(result_id) 
# access the result in the tempalte, for example {{ result.name }} 
return render_template('success.html', result=result) 
@app.route('/survey') 
def survey(): 
if request.method == 'POST': 
    # replace this with an insert into whatever database you're using 
    result = store_result_in_database(request.args) 
    return redirect(url_for('success', result_id=result.id)) 

# don't need to test request.method == 'GET' 
return render_template('survey.html') 

と私は「成功は」 '内でそこに着いたかを理解するために、まだ午前redirect() '

現在、現在作業中のviews.pyがあります。

from django.contrib import messages 
from django.http import HttpResponse, HttpResponseRedirect 
from django.shortcuts import render, get_object_or_404, redirect 


from.forms import PostForm 
from .models import Post 


from django.contrib.auth import authenticate, login 



def post_detail(request, id=None): 
    #instance = Post.objects.get(id=1) 
    instance = get_object_or_404(Post, id=id) 
    context = { 
     "title": instance.title, 
     "instance": instance, 
    } 
    return render(request, "post_detail.html", context) 

def post_list(request): 

    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      # Redirect to a success page. 
     else: 
      # Return a 'disabled account' error message 
     else: 
     # Return an 'invalid login' error message. 

    form = PostForm(request.POST or None) 

    if form.is_valid(): 
     instance = form.save(commit=False) 
     print (form.cleaned_data.get("title")) 
     instance.save() 
     # message success 
     messages.success(request, "Successfully Created") 
     return HttpResponseRedirect(instance.get()) 
    #else: 
     #messages.error(request, "Not Successfully Created") 
    queryset = Post.objects.all()#.order_by("-timestamp") 
    context = { 
     "object_list": queryset, 
     "title": "List", 
     "form": form, 
    } 
    return render(request, "post_list.html", context) 
    #return HttpResponse("<h1>List</h1>") 

def post_update(request, id=None): 
    instance = get_object_or_404(Post, id=id) 
    form = PostForm(request.POST or None, instance=instance) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     # message success 
     messages.success(request, "Saved") 
     return HttpResponseRedirect(instance.get_absolute_url()) 
    context = { 
     "title": instance.title, 
     "instance": instance, 
     "form":form, 
    } 
    return render(request, "post_form.html", context) 


def post_delete(request, id=None): 
    instance = get_object_or_404(Post, id=id) 
    instance.delete() 
    messages.success(request, "Successfully deleted") 
    return redirect("posts:list") 

私はこれらの種類の機能について助けを得ることができますか?

また、ログインフォームの実装方法を説明するチュートリアルもありますか?

ありがとうございました。

+0

あなたが理解していないこと! Docは、ホームページを表示してホームページをリダイレクトしたり、成功ページをレンダリングしてレンダリングしたりする場合、この場合成功した認証に成功すると成功ページにリダイレクトします。それは何が間違っていますか? –

+0

@RajaSimonは、MultiValueDictKeyError/ –

+0

を含むあらゆる種類のエラーを取得しています。 '@ app.route()'の最初のスニペットは、Djangoではなく、Flaskのようです。 – knbk

答えて

1

わかりましたが、最も単純なケースでは、このようなものが必要です。例えば、

from django.contrib.auth import login 
from django.http import HttpResponseRedirect 
from django.template.response import TemplateResponse 

def user_login(request): 
    if request.method == "POST": 
     form = AuthenticationForm(request, data=request.POST) 
     if form.is_valid(): 
      login(request, form.get_user()) 

      # if you use named views you can use reverse here: 
      # redirect_url = reverse('post_list') 
      # Or even if you want to return back to previous url: 
      # referrer = request.META['HTTP_REFERER'] 
      # if referrer: 
      #  redirect_url = referrer.split('/', 3)[3] 
      redirect_url = '/post-list/' # it's 'success page' 
      return HttpResponseRedirect(redirect_url) 

    else: 
     form = AuthenticationForm(request) 

    return TemplateResponse(request, 'login.html', {'form': form}) 

をそして今、あなたはあなたのPOSTビュー(/作成/更新、削除)のためlogin_requiredデコレータを使用することができます:

from django import forms 
from django.contrib.auth import authenticate 

class AuthenticationForm(forms.Form): 
    username = forms.CharField(max_length=254) 
    password = forms.CharField(widget=forms.PasswordInput) 

    def clean(self): 
     username = self.cleaned_data['username'] 
     password = self.cleaned_data['password'] 
     user = authenticate(username=username, password=password) 
     if user is None: 
      raise forms.ValidationError('invalid_login') 

     return self.cleaned_data 

は今見るログインの

from django.contrib.auth.decorators import login_required 

@login_required(login_url='/accounts/login/') 
def post_delete(request, id=None): 
    ... 

最も単純な例をフォーム(テンプレート):

<form method="post" action="{% url 'login' %}"> 
    {% csrf_token %} 
    Username: {{ form.username }} {{ form.username.errors }}<br> 
    Password: {{ form.password }} {{ form.password.errors }}<br> 
    {{ form.errors }}<br> 
    <input type="submit" value="login" /> 
</form>` 
+0

um。はい。種類の説明に感謝します。この時点では、コードが何であるかについてはまだ完全に理解していません。私はコードを正しく理解していれば、ログインフィールドを持つ別のページが必要です。上記のコードをdef post_listの中に入れて、ログインフィールドがpost_listページ内に存在するようにします。どのように@login_required(login_url = '/ accounts/login /')を使用する必要がありますか?また、ログインボックスをpost_listに配置する方法についても説明できますか?ありがとう。 –

+0

「ログインボックス」とはどういう意味ですか?ログインページやログインフォームへのリンクを意味しますか? –

+0

ログインフォーム。むしろ。それは可能だと思いますか?また、重複した 'フォーム'に起因する問題があります。私はすでに投稿フォームに 'form = PostForm(request.POST or None)'を使用しています。私はこれについてどうやって行くべきですか? (ごめんなさい、初心者です) –

関連する問題