Django 基础教程

Django 查询

Django 展示数据

Django Admin

Django 模板

Django 表单组件

Django 高级

Django FAQ

django forms传instance


在 Django 中,使用 ModelForm 来处理表单与模型之间的交互是非常方便的。当你需要在表单中传递一个实例(即一个数据库模型的对象),有几种方法可以实现这一点。以下是几种不同的方式以及它们的步骤流程和示例代码。

假设我们有一个名为 Book 的模型,它具有 titleauthor 两个字段。

# models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)

    def __str__(self):
        return self.title

方法 1:在视图中手动传递实例

步骤流程:

  1. 在视图函数中获取要传递的实例对象。
  2. 创建一个 ModelForm 实例,将实例对象传递给它。
  3. 将该 ModelForm 实例传递给模板渲染。
# views.py
from django.shortcuts import render
from .models import Book
from .forms import BookForm

def edit_book(request, book_id):
    book_instance = Book.objects.get(pk=book_id)

    if request.method == 'POST':
        form = BookForm(request.POST, instance=book_instance)
        if form.is_valid():
            form.save()
            # 处理表单提交后的逻辑
    else:
        form = BookForm(instance=book_instance)

    return render(request, 'edit_book.html', {'form': form})
<!-- edit_book.html -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Save</button>
</form>

方法 2:使用 UpdateView 类视图

步骤流程:

  1. 定义一个继承自 UpdateView 的类视图。
  2. 设置 model 属性为你的模型类,设置 form_class 属性为你的 ModelForm 类。
  3. 重写 get_object 方法,返回要传递的实例对象。
# views.py
from django.urls import reverse_lazy
from django.views.generic.edit import UpdateView
from .models import Book
from .forms import BookForm

class BookUpdateView(UpdateView):
    model = Book
    form_class = BookForm
    template_name = 'edit_book.html'
    success_url = reverse_lazy('book_list')  # Redirect URL after successful form submission

    def get_object(self, queryset=None):
        book_id = self.kwargs.get('book_id')
        return Book.objects.get(pk=book_id)
<!-- edit_book.html -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Save</button>
</form>

方法 3:自定义 ModelForm 的__init__方法

步骤流程:

  1. 创建一个继承自 ModelForm 的自定义表单类。
  2. 在自定义表单类的 __init__ 方法中,接收并处理传递的实例对象。
# forms.py
from django import forms
from .models import Book

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['title', 'author']

    def __init__(self, *args, **kwargs):
        instance = kwargs.get('instance')
        super().__init__(*args, **kwargs)
        if instance:
            self.fields['title'].initial = instance.title
            self.fields['author'].initial = instance.author
# views.py
from django.shortcuts import render
from .models import Book
from .forms import BookForm

def edit_book(request, book_id):
    book_instance = Book.objects.get(pk=book_id)

    if request.method == 'POST':
        form = BookForm(request.POST, instance=book_instance)
        if form.is_valid():
            form.save()
            # 处理表单提交后的逻辑
    else:
        form = BookForm(instance=book_instance)

    return render(request, 'edit_book.html', {'form': form})
<!-- edit_book.html -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Save</button>
</form>

无论使用哪种方式,都可以在表单中传递一个数据库模型的实例对象,使得编辑和更新操作更加方便。

当谈到Pythonweb开发框架时,Django是一个非常流行和强大的选择。MVC架构:Django使用MTV(模型、模板、视图)模式,类似 ...
Django和Flask都是用于构建Web应用程序的PythonWeb框架,但它们在设计哲学、功能和用途上有一些明显的区别。学习曲线和开发速 ...
采用了MVT的软件设计模式,即模型(Model),视图(View)和模板(Template)。这套框架是以比利时的吉普赛爵士吉他手Djang ...
在Django中,查询是通过模型管理器(ModelManager)来实现的。示例:假设我们有一个名为Book的模型,其中包含图书的信息,我们 ...
"Django"和"HTML",它们实际上是两个不同的概念,分别代表了一个Web框架和一种标记语言。它提供了许多工具和功能,使开发者能够更轻 ...