2016-07-18 4 views
0

노력하고 몇 시간이 지난 후에도 계속 그렇게 할 수는 없습니다.django를 사용하여 로그인 양식을 작성하는 방법

기본적으로 나는 postform과 함께 django를 사용하여이 .post_list.html 안에 로그인 양식을 넣으려고합니다.

이것은 views.py

from django.contrib import messages 
from django.http import HttpResponse, HttpResponseRedirect 
from django.shortcuts import render, get_object_or_404, redirect 
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 

from .forms import PostForm, AuthenticationForm 
from .models import Post 

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}) 
    else: 
     form = AuthenticationForm() 

    postform = PostForm(request.POST or None) 

    if postform.is_valid(): 
     instance = postform.save(commit=False) 
     print (postform.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": postform, 
     "form2": form 
    } 
    return render(request, "post_list.html", context) 

이고 이것은 forms.py

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_lost.html이다 (따라서 2 가지 형태가있다)

{% 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

@jape 죄송합니다, 상황을 설명하지 않았다 당신이 시도해야처럼

그래서 본다. postform이 작동하지만 로그인 필드는 html에 표시되지 않습니다. –

+0

"form": postform, "form2": form을 문맥으로 전달하고 있습니다. 로그인 양식이 form2 인 것 같습니다. {{form2.username}} 등을 사용하려고한다면 어떻게 될까요? – Paul

답변

1

내 생각에 이름 지정 때문에이 문제가 발생했습니다. 당신은 컨텍스트에 다음 사항을 전달 : 당신은 당신이 때문에 템플릿 form에 실패 form.username에 액세스하려고 할 때

form = AuthenticationForm() 
postform = PostForm(request.POST or None) 
... 
context = { 
      "object_list": queryset, 
      "title": "List", 
      "form": postform, 
      "form2": form 
     } 

그래서하는 postform입니다. 그리고 postform에는 'usarname'필드가 없습니다.

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

당신은 내 생명을 구했어! 전혀 몰랐다. 이제 로컬 서버에서 제대로 작동하는 것 같습니다. 하지만 어떤 이유로이 코드를 서버에 업로드 할 때 로그인 양식이 다시 표시되지 않습니다. 이 views.py를보고 서버에서 작동하지 않는 이유를 말해 줄 수 있습니까? https://dpaste.de/VpJ7#L7,11,20,24 post_list.html은 위와 같습니다. –

관련 문제