首页 > 解决方案 > 如何为updateview制作表单html

问题描述

我正在使用我的 html 文件为 CreateView 和 UpdateView 制作自己的表单,因为我不想显示像 {{form.as_p}} 这样的表单。

表格.py

from django import forms
from .models import Post

class PostCreationForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = ('title', 'cover', 'text',)
        widgets = {
            'title': forms.TextInput(attrs={'class': 'title'}),
            'cover': forms.FileInput(attrs={'class': 'image'}),
            'text': forms.TextInput(attrs={'class': 'text'})
        }

class PostDeleteForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = ('__all__')

视图.py

from django.shortcuts import reverse
from django.http import HttpResponseRedirect
from django.views import generic
from .models import Post
from .forms import PostCreationForm, PostDeleteForm

class PostListView(generic.ListView):
    model = Post
    context_object_view = 'post_list'
    template_name = 'forum/post_list.html'


class PostDetailView(generic.DetailView):
    model = Post
    context_object_view = 'post'
    template_name = 'forum/post_detail.html'

class PostCreateView(generic.CreateView):
    model = Post
    form_class = PostCreationForm
    template_name = 'forum/post_create.html'

    def form_valid(self, form):
        if form.is_valid():
            response = form.save(commit = False)
            response.author = self.request.user
            response.save()
            return HttpResponseRedirect(reverse('post_detail', args=[str(response.id)]))


class PostUpdateView(generic.UpdateView):
    model = Post
    context_object_view = 'post'
    form_class = PostCreationForm
    template_name = 'forum/post_edit.html'

    def get_post(self, pk):
        return get_object_or_404(Post, pk=pk)

    def form_valid(self, form):
        if form.is_valid():
            response = form.save(commit = False)
            response.save()
            return HttpResponseRedirect(reverse('post_detail', args=[str(response.id)]))


class PostDeleteView(generic.DeleteView):
    model = Post
    context_object_view = 'post'
    form_class = PostDeleteForm
    template_name = 'forum/post_delete.html'
    success_url = '/'

    def get_post(self, pk):
        return get_object_or_404(Post, pk=pk)

post_create.html

{% extends '_base.html' %}

{% block css %}
    {% load static %}
    <link rel="stylesheet" href="{% static 'css/post_create.css' %}">
{% endblock css %}

{% block title %}Questions{% endblock title %}

{% block content %}

<h1 class="m-title">New Post</h1>

<div class="form">
    <form action="" method="post" enctype="multipart/form-data" id='postform'>
        {% csrf_token %}
        <p class="n-title"><label for="id_title">Title: </label></p>
        <input id="id_title" type="text" name="title" class="title" maxlength="40" required>

        <p class="n-image"><label for="id_cover">Image: </label></p>
        <input id="id_cover" type="file" name="cover" class="image" required>

        <p class="n-text"><label for="id_text">Text: </label></p>
        <textarea id="id_text" placeholder="Enter your text here" name="text" class="text" form='postform' required></textarea>
        <button class="btn btn-success" id="button" type="submit">Submit</button>
    </form>
</div>

{% endblock content %}

而且我也想为UpdateView做,但是我不知道如何让输入字段显示帖子的当前值(标题,文本)。html 文件与 CreateView 相同。如何使输入显示正在修改的帖子的当前值?

标签: pythonhtmldjango

解决方案


您可能不想为这样的表单手动编写 html。

如果必须,您可以传递如下值:

<input id="id_title" type="text" name="title" class="title" maxlength="40" value="{{ form.title.value }}" required>

最好使用 django 呈现该字段,以便您的表单字段属性(如 maxlength 和 required)与您的表单类规范匹配。例如,这将为您的标题字段创建输入:

{{ form.title }}

如果你想在造型上有更多的灵活性,看看脆皮形式或我喜欢的软盘形式


推荐阅读