首页 > 解决方案 > 未正确创建 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 页面,但从未创建弹出窗口。怎么了?

标签: pythondjango

解决方案


推荐阅读