python - 未正确创建 Django formset 模型
问题描述
我的代码:
# forms.py
class PopupForm(forms.ModelForm):
class Meta:
model = Popup
exclude = ()
class LiveStreamForm(forms.ModelForm):
class Meta:
model = LiveStream
exclude = ("date_created",)
PopupFormSet = inlineformset_factory(LiveStream,Popup,exclude=(),extra=3)
# models.py
class Popup(models.Model):
total_seconds_to_initiate = models.BigIntegerField()
livestream = models.ForeignKey('LiveStream', on_delete=models.CASCADE, blank=True, null=True)
def __str__(self):
return "%s seconds, ls:%s" % (self.total_seconds_to_initiate, self.livestream)
def get_absolute_url(self):
return reverse("livestream_detail", kwargs={
'pk': str(self.livestream.id),})
class LiveStream(models.Model):
youtube_id = models.CharField(max_length=255, blank=True, null=True)
date_created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return "%s (%s)" % (self.youtube_id, self.id)
def get_absolute_url(self):
return reverse("livestream_detail", kwargs={
'pk': str(self.id),})
# views.py
class LiveStreamCreateView(CreateView):
model = LiveStream
form_class = LiveStreamForm
template_name = 'livestream/livestream_create.html'
def get(self, request, *args, **kwargs):
"""
Handles GET requests and instantiates blank versions of the form
and its inline formsets.
"""
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
popup_form_set = PopupFormSet()
return self.render_to_response(
self.get_context_data(form=form,
popup_form_set=popup_form_set,))
def post(self, request, *args, **kwargs):
"""
Handles POST requests, instantiating a form instance and its inline
formsets with the passed POST variables and then checking them for
validity.
"""
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
popup_form_set = PopupFormSet(self.request.POST)
if (form.is_valid() and popup_form_set.is_valid()):
return self.form_valid(form, popup_form_set)
else:
return self.form_invalid(form, popup_form_set)
def form_valid(self, form, popup_form_set):
"""
Called if all forms are valid. Creates a Recipe instance along with
associated Ingredients and Instructions and then redirects to a
success page.
"""
f = form.save(commit=False)
self.object = form.save()
popup_form_set.instance = self.object
popup_form_set.save()
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form, popup_form_set):
"""
Called if a form is invalid. Re-renders the context data with the
data-filled forms and errors.
"""
return self.render_to_response(
self.get_context_data(form=form,
popup_form_set=popup_form_set,))
# livestream_create.html
<form method="POST">
{% csrf_token %}
Enter the Channel ID of the Livestream Here.
{{form}}<br>
{{ popup_form_set.management_form }}
{{ popup_form_set.non_form_errors }}
{% for popup_form in popup_form_set %}
{{popup_form}}<br>
{% endfor %}
<input type="submit" value="Save">
</form>
我希望用户能够在他们创建 Livestream 对象的同一页面上创建 Popup 对象。目前该表单看起来应该可以工作:有一个 Livestream Youtube ID 字段和 3 个 Popup total_seconds_to_initiate 字段。应该发生的是,我输入一个 youtube ID,然后输入任意数量 (=<3) 的弹出窗口,然后我被重定向到 livestream_detail 页面。好吧,我被重定向到 livestream_detail 页面,但从未创建弹出窗口。怎么了?
解决方案
推荐阅读
- html - 范围样式表到元素
- airflow - 气流ssh连接,连接类型不显示
- c - 如何在三元表达式中执行/模拟空字符
- corda - 用intellij在windows上构建corda 4.8
- javascript - For 循环 if 语句在第一种情况下停止
- spring-boot - 在 reactor Java 中顺序执行 Reactive 任务
- kotlin - 使用派生字段创建一个新类,而不重复字段名称
- css - @media only screen 和 @media screen query 哪个是更好的选择
- java - 当键和值是重新排列时如何删除映射键
- python - 如何使用索引创建加密/解密函数?