详解Django的 get_initial() 函数:获取表单的初始值

  • Post category:Python

Django的get_initial()函数用于在创建表单实例时提供初始数据。它可以通过在视图中重写get_initial()方法并返回一个字典来实现。视图中可以使用该方法来提供表单的预填值,这些值可以是任何值,例如数据库中已经有的条目的值、会话值等。

下面提供两个实例:

实例1 – 通过URL参数提供表单初始值

假设有一个用户编辑资料的表单,可通过URL将已有的普通用户id传递给编辑表单,以便在表单加载时显示这个用户的详细信息。这里可以使用get_initial()方法来提供form表单的预填值,然后通过将表单实例与初始值一起传递到模板来渲染表单。

模型:

from django.db import models

class UserProfile(models.Model):
    """
    用户资料
    """
    nickname = models.CharField(max_length=128)
    gender = models.CharField(max_length=32)
    age = models.IntegerField()
    phone_number = models.CharField(max_length=20)

视图:

from django.shortcuts import render, get_object_or_404
from django.views.generic.edit import UpdateView
from .models import UserProfile
from .forms import UserProfileForm

class UserProfileUpdateView(UpdateView):
    model = UserProfile
    form_class = UserProfileForm
    template_name = 'user_profile_form.html'
    # 通过URL获取用户id作为get_initial()的参数
    def get_initial(self):
        initial = super(UserProfileUpdateView, self).get_initial()
        initial['user_id'] = self.kwargs['user_id']
        return initial

模板:

{% extends 'base.html' %}

{% block content %}
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit">
  </form>
{% endblock %}

实例2 – 使用会话值提供表单初始值

另一个常见的使用情景是在表单中预先填充来自用户会话的值,例如,当用户转到下一页时,他们可以看到他们已经填写的内容。

视图:

from django.shortcuts import render
from django.contrib.sessions.backends.db import SessionStore
from .forms import UserProfileForm

def my_form_view(request):
    if request.method == "POST":
        form = UserProfileForm(request.POST)
        if form.is_valid():
            # 保存到会话
            for field in form.fields:
                request.session[field] = form.cleaned_data[field]
            return redirect('success-page')
    else:
        # 使用会话中保存的值提供表单初始值
        initial = {'field1': request.session.get('field1', ''), 'field2': request.session.get('field2', '')}
        form = UserProfileForm(initial=initial)
    return render(request, 'my_template.html', {'form': form})

模板:

{% extends 'base.html' %}

{% block content %}
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit">
  </form>
{% endblock %}

总结:get_initial()方法通常用于表单的初始值的提供,可以使用它通过URL参数、会话值或其他来源来设置预填值。