Python Django表单集模型未正确创建
我的代码:Python Django表单集模型未正确创建,python,django,Python,Django,我的代码: # forms.py class PopupForm(forms.ModelForm): class Meta: model = Popup exclude = () class LiveStreamForm(forms.ModelForm): class Meta: model = LiveStream exclude = ("date_created",) PopupFo
# 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>
#forms.py
类弹出窗体(forms.ModelForm):
类元:
模型=弹出窗口
排除=()
类LiveStreamForm(forms.ModelForm):
类元:
模型=实时流
排除=(“创建日期”)
PopupFormSet=inlineformset_工厂(LiveStream、Popup、exclude=()、extra=3)
#models.py
类弹出窗口(models.Model):
启动的总秒数=models.BigIntegerField()
livestream=models.ForeignKey('livestream',on_delete=models.CASCADE,blank=True,null=True)
定义(自我):
返回“%s秒,ls:%s”%(self.total\u秒到\u initiate,self.livestream)
def get_绝对_url(自身):
返回反向(“livestream_细节”,kwargs={
“pk”:str(self.livestream.id),})
类LiveStream(models.Model):
youtube_id=models.CharField(最大长度=255,空白=True,空=True)
date\u created=models.DateTimeField(auto\u now\u add=True)
定义(自我):
返回“%s(%s)”%(self.youtube\u id,self.id)
def get_绝对_url(自身):
返回反向(“livestream_细节”,kwargs={
“pk”:str(self.id),})
#views.py
类LiveStreamCreateView(CreateView):
模型=实时流
form_class=LiveStreamForm
template_name='livestream/livestream_create.html'
def get(自我、请求、*args、**kwargs):
"""
处理GET请求并实例化表单的空白版本
以及它的内联表单集。
"""
self.object=None
form\u class=self.get\u form\u class()
表单=自我。获取表单(表单类)
popup_form_set=PopupFormSet()
返回self.render\u to\u响应(
self.get\u context\u数据(form=form,
popup_form_set=popup_form_set,))
def post(自我、请求、*args、**kwargs):
"""
处理POST请求,实例化表单实例及其内联
带有传递的POST变量的表单集,然后检查它们的
有效性
"""
self.object=None
form\u class=self.get\u form\u class()
表单=自我。获取表单(表单类)
popup\u form\u set=PopupFormSet(self.request.POST)
如果(form.is\u valid()和popup\u form\u set.is\u valid()):
返回self.form\u valid(表单、弹出式表单集)
其他:
返回self.form\u无效(表单、弹出式表单集)
def表单有效(自身、表单、弹出式表单集):
"""
如果所有表单都有效,则调用。创建配方实例以及
关联的成分和说明,然后重定向到
成功页面。
"""
f=表单.save(提交=False)
self.object=form.save()
popup\u form\u set.instance=self.object
弹出表单集合。保存()
返回HttpResponseRedirect(self.get_success_url())
def表单无效(自身、表单、弹出表单集):
"""
如果表单无效,则调用。使用
填写数据的表格和错误。
"""
返回self.render\u to\u响应(
self.get\u context\u数据(form=form,
popup_form_set=popup_form_set,))
#livestream_create.html
{%csrf_令牌%}
在此处输入Livestream的频道ID。
{{form}}
{{popup_form_set.management_form}
{{popup_form_set.non_form_errors}
{popup_form_set%中的popup_form的百分比}
{{popup_form}}
{%endfor%}
我希望用户能够在创建Livestream对象的同一页面上创建弹出对象。目前,表单看起来应该可以正常工作:有一个Livestream Youtube ID字段和3个弹出总秒数到初始化字段。应该做的是,我输入一个youtube ID,然后输入一个任意数字(=很可能你的表单是无效的(),它不会创建模型。你可以通过在任何地方添加
print()
来确认这一点,打印两个弹出表单集。是否有效()
,表单。是否有效()和弹出表单集。错误和表单错误调试101。这可能有助于了解实际情况。弹出表单集是有效的。表单也是有效的。请求.POST
在POST()中包含什么?