gpt4 book ai didi

python - 在一个 Django View 中组合两种形式

转载 作者:太空狗 更新时间:2023-10-30 00:22:49 25 4
gpt4 key购买 nike

我正在努力为 Django 官方教程中制作的投票应用程序添加更多功能。我正在做的一件事是让登录的用户可以创建民意调查/选择(而不是在管理屏幕中,教程留给我们的地方)。

我希望创建一个 View ,用户可以在其中创建投票,然后还包括一些与投票相关联的选项。 Django 管理员会自动执行此操作,但我不确定如何在 View 中将其写出来。

首先,这些是我的相关文件:

模型.py

import datetime

from django.db import models
from django.utils import timezone


class Poll(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')

def __unicode__(self):
return self.question_text

def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'

class Choice(models.Model):
question = models.ForeignKey(Poll)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)

def __unicode__(self):
return self.choice_text

表单.py

from django import forms
from .models import Poll, Choice
from datetime import datetime

class PollForm(forms.ModelForm):
question_text = forms.CharField(max_length=200, help_text="Please enter the question.")
pub_date = forms.DateTimeField(widget=forms.HiddenInput(), initial = datetime.now())

class Meta:
model = Poll
fields = ("__all__")

class ChoiceForm(forms.ModelForm):
choice_text = forms.CharField(max_length=200, help_text="Please enter choices.")
votes = forms.IntegerField(widget=forms.HiddenInput(),initial=0)
exclude = ('poll',)

View .py

def add_poll(request):
# A HTTP POST?
if request.method == 'POST':
form = PollForm(request.POST)

# Have we been provided with a valid form?
if form.is_valid():
# Save the new category to the database.
form.save(commit=True)

# Now call the index() view.
# The user will be shown the homepage.
return render(request, 'polls/index.html', {})
else:
# The supplied form contained errors - just print them to the terminal.
print form.errors
else:
# If the request was not a POST, display the form to enter details.
form = PollForm()

# Bad form (or form details), no form supplied...
# Render the form with error messages (if any).
return render(request, 'polls/add_poll.html', {'form': form})

目前,我的 View 允许我的用户添加投票。我只是不确定如何调整它以将输入的文本作为 Poll 模型的 question_text 传递给 Choice 模型,然后传递给 ChoiceForm。

最佳答案

Formsets是在 django 中做到这一点的方法。

首先为 Poll.pub_date 字段添加 default 值:

class Poll(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published', default=timezone.now)

然后让表单更简单一些:

class PollForm(forms.ModelForm):
class Meta:
model = Poll
fields = ('question_text', )

class ChoiceForm(forms.ModelForm):
class Meta:
model = Choice
fields = ('choice_text',)

为您的 View 添加表单集支持:

from django.forms.formsets import formset_factory

def add_poll(request):
ChoiceFormSet = formset_factory(ChoiceForm, extra=3,
min_num=2, validate_min=True)
if request.method == 'POST':
form = PollForm(request.POST)
formset = ChoiceFormSet(request.POST)
if all([form.is_valid(), formset.is_valid()]):
poll = form.save()
for inline_form in formset:
if inline_form.cleaned_data:
choice = inline_form.save(commit=False)
choice.question = poll
choice.save()
return render(request, 'polls/index.html', {})
else:
form = PollForm()
formset = ChoiceFormSet()

return render(request, 'polls/add_poll.html', {'form': form,
'formset': formset})

最后是你的模板:

<form method="post">

{% csrf_token %}

<table>
{{ form }}
{{ formset }}
</table>

<button>Add</button>

</form>

关于python - 在一个 Django View 中组合两种形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28054991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com