如何在 Django ModelForms 中加载实例
How to load an instance in Django ModelForms
我正在使用 Django 的用户模型。
如何获取 Django ModelForm 以在模板中预填充值?我知道我必须使用该表单的实例,但下面哪里出错了:
models.py:
class Site(models.Model):
user = models.ForeignKey(User, )
site_name = models.CharField(max_length=128, blank=False, null=False)
forms.py:
class SiteForm(forms.ModelForm):
class Meta:
model = Site
fields = '__all__'
views.py:
def settings(request):
site_profile = Site.objects.get(user=request.user)
if request.method == "POST":
form = SiteForm( instance=site_profile )
if form.is_valid():
form.save()
return redirect('dashboard_home')
else:
form = SiteForm()
return render(request, "dashboard/settings.html", {'form': form })
此代码 returns 页面没有错误,但是没有使用数据库中的值预填充表单字段。
我只能假设 instance
加载不正确?
def settings(request):
site_profile = Site.objects.get(user=request.user)
if request.method == "POST":
form = SiteForm( instance=site_profile )
if form.is_valid():
form.save()
return redirect('dashboard_home')
else:
form = SiteForm(instance = site_profile)
return render(request, "dashboard/settings.html", {'form': form })
- 第 12 行的 else 块缩进了一个 much
- 您还必须在 else 块中设置实例参数
def settings(request):
if request.method == "POST":
form = SiteForm(request.POST, instance=request.user.site_profile)
if form.is_valid():
form.save()
return redirect('dashboard_home')
site_profile = Site.objects.get(user=request.user)
form = SiteForm(instance=site_profile)
return render(request, "dashboard/settings.html", {'form': form })
您的缩进已关闭,您从未将 site_profile
传递给表单以填充它。在 POST
请求的情况下,您不想将旧版本的 site_profile
传递给表单。我假设您需要用户在模板中填写的新值。
根据我的经验,将默认行为假设为基于函数的视图中的 GET
请求将避免一些错误,并且您将摆脱那些 if-else
语句。如果您正在尝试编辑对象,您也需要在 GET
请求期间填充表单:
def settings(request):
site_profile = Site.objects.get(user=request.user)
form = SiteForm(instance=site_profile) # GET method
if request.method == "POST":
# Don't forget the request.POST !
form = SiteForm(request.POST, instance=site_profile)
if form.is_valid():
form.save()
return redirect('dashboard_home')
return render(request, "dashboard/settings.html", {'form': form })
我正在使用 Django 的用户模型。
如何获取 Django ModelForm 以在模板中预填充值?我知道我必须使用该表单的实例,但下面哪里出错了:
models.py:
class Site(models.Model):
user = models.ForeignKey(User, )
site_name = models.CharField(max_length=128, blank=False, null=False)
forms.py:
class SiteForm(forms.ModelForm):
class Meta:
model = Site
fields = '__all__'
views.py:
def settings(request):
site_profile = Site.objects.get(user=request.user)
if request.method == "POST":
form = SiteForm( instance=site_profile )
if form.is_valid():
form.save()
return redirect('dashboard_home')
else:
form = SiteForm()
return render(request, "dashboard/settings.html", {'form': form })
此代码 returns 页面没有错误,但是没有使用数据库中的值预填充表单字段。
我只能假设 instance
加载不正确?
def settings(request):
site_profile = Site.objects.get(user=request.user)
if request.method == "POST":
form = SiteForm( instance=site_profile )
if form.is_valid():
form.save()
return redirect('dashboard_home')
else:
form = SiteForm(instance = site_profile)
return render(request, "dashboard/settings.html", {'form': form })
- 第 12 行的 else 块缩进了一个 much
- 您还必须在 else 块中设置实例参数
def settings(request):
if request.method == "POST":
form = SiteForm(request.POST, instance=request.user.site_profile)
if form.is_valid():
form.save()
return redirect('dashboard_home')
site_profile = Site.objects.get(user=request.user)
form = SiteForm(instance=site_profile)
return render(request, "dashboard/settings.html", {'form': form })
您的缩进已关闭,您从未将 site_profile
传递给表单以填充它。在 POST
请求的情况下,您不想将旧版本的 site_profile
传递给表单。我假设您需要用户在模板中填写的新值。
根据我的经验,将默认行为假设为基于函数的视图中的 GET
请求将避免一些错误,并且您将摆脱那些 if-else
语句。如果您正在尝试编辑对象,您也需要在 GET
请求期间填充表单:
def settings(request):
site_profile = Site.objects.get(user=request.user)
form = SiteForm(instance=site_profile) # GET method
if request.method == "POST":
# Don't forget the request.POST !
form = SiteForm(request.POST, instance=site_profile)
if form.is_valid():
form.save()
return redirect('dashboard_home')
return render(request, "dashboard/settings.html", {'form': form })