在实现i之后,登录字段不可见

2024-04-26 10:15:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用django的authenticationForm实现登录字段

我的问题是,因为我试图在一个页面(post\ list)中显示两个不同的表单,所以它似乎会导致许多错误

一个用于登录字段,一个用于发布文章

我似乎对复制表单也有问题,因为这两个表单对我不知道如何更改的表单使用相同的名称

另外,当我尝试使用post表单发布某些内容时,也会发生错误

明目张胆地说,如何使登录字段可见

我建议您访问工作站点:http://mtode.com(这只是一个表示站点,不包含登录字段部分)

这是我的观点,其中包含的定义

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

这是包含表单的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\u list.html

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

谢谢你


Tags: djangoinstancefromimportdivformidget
1条回答
网友
1楼 · 发布于 2024-04-26 10:15:44

最初显示页面时,request.methodGET。因此,post\u列表视图正在创建一个PostForm实例,并将其作为form元素传递到模板中

PostForm没有usernamepassword属性,因此这些项被视为空字符串,根本不呈现

如果希望模板呈现两个窗体,则需要将它们作为单独的名称传递。你不能把它们都称为“形式”

相关问题 更多 >