2016-07-18 8 views
0

djangoのauthenticationFormを使用してログインフィールドを実装しようとしています。ログインフィールドは実装後に表示されません

問題は、1つのページ(post_list)内に2つの異なるフォームを表示しようとしているため、多くのエラーが発生するようです。

1つはログイン用、1つは投稿用です。

私はまた、2つのフォームがどのように変更するのか分からないフォームにsamenameを使用するので、重複したフォームに問題があるようです。

また、投稿フォームを使用して何かを投稿しようとするとエラーが発生します。

私はログインフィールドをどのように見えるようにしますか?

私は作業現場にあなたを参照してください。これは定義

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, AuthenticationForm 
from .models import Post 


from django.contrib.auth import authenticate, login 


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

from django.contrib.auth.decorators import login_required 



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): 



    if request.method == "POST": 
     form = AuthenticationForm(request, data=request.POST) 
     if form.is_valid(): 
      login(request, form.get_user()) 
      return HttpResponseRedirect('/post-list/') 

     else: 
      form = AuthenticationForm(request) 

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



    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") 

が含まれている私の意見のPYある

(これは単なる表現サイトで、ログインフィールドの一部が含まれていない)http://mtode.comとこれは、フォーム

from django import forms 

from .models import Post 

class PostForm(forms.ModelForm): 
    class Meta: 
     model = Post 
     fields = [ 
     "title", 
     "content" 
     ] 

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 

が含まれており、これはpost_list.html

0であるforms.pyです
{% extends "base.html" %} 
{% block content %} 


<form method="post" action=""> 
    {% 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> 


<div class='two columns right mgr'> 
    <h1>Form</h1> 
<form method='POST' action=''>{% csrf_token %} 
{{ form.as_p }} 
<input class="button-primary" type='submit' value='Create Post' /> 
</form> 
</div> 

<div class='four columns left'> 
    <h1>{{ title }}</h1> 

{% for obj in object_list %} 



<div class="row"> 
    <div> 
    <a href='{{ obj.get_absolute_url }}'> 
    <div class="thumbnail"> 
     <!--<img src="..." alt="...">!--> 
     <div class="caption"> 
     <h3>{{ obj.title }}<small> {{ obj.timestamp|timesince }} ago</small></h3> 
     <p>{{ obj.content|linebreaks|truncatechars:120 }}</p> 
     <!-- <p><a href='{{ obj.get_absolute_url }}' class="btn btn-primary" role="button">View</a> </p>--> 
     </div> 


    </div></a> 
    </div> 
    <hr /> 
</div> 

{% endfor %} 

</div> 
{% endblock content %} 

ありがとうございます。

答えて

0

ページが最初に表示されるとき、request.methodGETです。したがって、post_listビューはPostFormインスタンスを作成し、それをテンプレートにform要素として渡しています。

PostFormには属性がないため、これらの項目は空の文字列として扱われ、まったく表示されません。

テンプレートで2つのフォームをレンダリングする場合は、別々の名前として渡す必要があります。両方とも「フォーム」と呼ぶことはできません。

+0

はい。私はその部分をよく理解しています。しかし、この場合、具体的に私は何をお勧めしますか?心に留めておくと、私はPython言語を読むのが良くないので、GETの場合にはいくつかの行を挿入する方法は考えられません。私はrequest.method == "GET"を変更してみましたが、それがうまくいくかどうかを見ていますが、明らかに私は理解できないエラーを吐き出しています。明らかに私ができることは非常に限られています。ログインフォームと投稿フォームを表示させるために必要なことを私に説明してもらえますか?私はform2 = AuthenticationFormで名前を変更しようとしましたが、正しく行っていません。 –

+0

'post_list.html'には2つのフォームが含まれているので、そのテンプレートをレンダリングするときは常に2つのフォームオブジェクトを渡す必要があります。おそらく 'コンテキスト'辞書に 'authform'と' postform'と呼んで、別の名前を使うようにテンプレートを編集してください。 –

+0

命令に感謝します。彼らは助けになった。しかし、GETリクエストメソッドのためにいくつかの行を追加しようとしたにもかかわらず、私は別のエラーで '割り当て前に参照された'ローカル変数 'フォーム'といっしょに立ち往生しています。このような状況からどうやって逃げることができるのか説明できますか? view.py https://dpaste.de/mvsZ#Lの私のdpasteは –

関連する問題