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参数、会话值或其他来源来设置预填值。