从相关模型创建表单

时间:2015-05-06 07:12:44

标签: python django django-models django-forms

我有2个模型,消息和附件。 我想以一种形式使用它们。附件应该具有对消息的引用(消息可以具有多于1个附件)。

型号:

class Message(models.Model): 
    createdby   = models.ForeignKey(User)
    subject     = models.CharField(max_length=200, null=True)
    body        = models.TextField(default=None,   blank=True)

class Attachment(models.Model):
    docfile     = models.FileField(upload_to='documents/%Y/%m/%d')
    message     = models.ForeignKey(Message,  null=True)

表单

class MessageForm(forms.ModelForm):
    class Meta:
        model   = Message

AttachmentFormSet = inlineformset_factory(Message, Attachment, extra=1 )

浏览

class MessageCreateView(CreateView):
     model       = Message
     fields      = ["subject", "body"]
     form_class  = MessageForm
     success_url = 'success/'

    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)
        attachment_form = AttachmentFormSet()

        return self.render_to_response(
            self.get_context_data(form  =form,
                                  attachment_form=attachment_form,
                                  ))

    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)
        attachment_form = AttachmentFormSet(self.request.POST)
        if (form.is_valid() and attachment_form.is_valid()):
            return self.form_valid(form, attachment_form)
        else:
            return self.form_invalid(form, attachment_form)

    def form_valid(self, form, attachment_form):
        """
        Called if all forms are valid. Creates a Message instance along with
        associated Attachment then redirects to a success page.
        """
        self.object   = form.save()

        attachment_form.instance = self.object
        self.object   = attachment_form.save()
        return HttpResponseRedirect(self.get_success_url())

我尝试了很多东西,但由于某种原因,附件永远不会被保存。 form_valid()函数中必定缺少某些东西,但我无法弄清楚是什么。

为了完整性,这里还有模板:

<script type="text/javascript">
        $(function() {
            $(".inline.{{ attachment_form.prefix }}").formset({
                prefix: "{{ attachment_form.prefix }}"
            })
        });
</script>
<form class="" action="/bugtrack/project/{{ project_id }}/tickets/{{ ticket_id }}/replyform/" method="post" id="replyform">
        {% csrf_token %}
        {{ form |crispy }}        

        {{ attachment_form.management_form }}
        {% for formattach in attachment_form  %}
            {{ formattach.id }}
            <div class="inline {{ attachment_form.prefix }}">
                {{ formattach.docfile }}
            </div>
        {% endfor %}

       <button class="btn btn-info pull-right btn-sm" type="submit" name="submit" value="createReply">Submit</button>
</form>

正确保存邮件和附件的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我认为你没有保存attachment_form。你只是将它转换为变量。请注意,在本教程中,编写器为每个表单调用.save()。尝试:

def form_valid(self, form, attachment_form):
    """
    Called if all forms are valid. Creates a Message instance along with
    associated Attachment then redirects to a success page.
    """
    self.object   = form.save()

    attachment_form.instance = self.object
    attachment_form.save()
    return HttpResponseRedirect(self.get_success_url())