【问题标题】:Uploading multiple images in Django for a single post在 Django 中为单个帖子上传多个图像
【发布时间】:2016-04-14 02:44:15
【问题描述】:

我是 django 的初学者。我想做一个允许用户记录检查和相关图像的应用程序。

所以我尝试根据这个主题http://qasimalbaqali.com/uploading-multiple-images-in-django-for-a-single-post/ 在 Django 中为单个帖子上传多个图像。

但是当我按下按钮时没有任何反应 我解释我的模型。文档是一个通用类。考试是一个文件,一个文件包含文件。

class Document(models.Model):

    class Meta:
        db_table = 'Document'

    slug = models.SlugField(max_length=100)
    user = models.ForeignKey(User)
    level = models.ForeignKey(ClassLevel, null=False, default=1)
    school = models.ForeignKey(School, null=False, default=1)
    nb_views = models.IntegerField(default=0)
    name = models.CharField(max_length=100)
    matter = models.ForeignKey(ClassTopic, null=False, default=1)
    status = models.IntegerField(choices=DOCUMENT_STATUS, default=1)
    creation_date = models.DateTimeField(auto_now_add=True)
    deletion_date = models.DateTimeField(auto_now_add=False, default=None, null=True)

    def __unicode__(self):
        return self.name + " (" + str(self.status) + ") " + self.school.name


class DocumentFile(models.Model):

    class Meta:
        db_table = 'DocumentFile'

    file = models.FileField(upload_to="photo/", null=True)
    document = models.ForeignKey(Document)

    def __unicode__(self):
        return self.file

class Exam(Document):

    class Meta:
        db_table = 'Exam'
    year_exam = models.IntegerField(choices=EXAM_YEAR_CHOICES, default=1)
    mock_exam = models.IntegerField(choices=EXAM_TYPE, default=1)

    def __unicode__(self):
        return self.name + " " + self.matter

我创建了两个表单。用于考试和存档。

class UploadFileForm(ModelForm):

    #description = forms.CharField(max_length=30)

    file = forms.FileInput()

    helper = FormHelper()
    helper.form_id = 'file-input'
    helper.form_show_labels = False
    helper.layout = Layout(PrependedText('file', "", placeholder=""))
    #helper.layout.insert(1, HTML("<input type='file' class='file' multiple data-show-upload='false' data-show-caption='true'>"))

    class Meta:
        model = DocumentFile
        fields = ('file',)
        #exclude = ("file_type", "file_path", "document")

class CreateExamForm(forms.ModelForm):

    helper = FormHelper()
    helper.form_id = 'CreateExam'
    helper.form_show_labels = False
    helper.layout = Layout(
        PrependedText("matter", "", ""),
        PrependedText("level", "<small class='text-warning'>Selectionner la classe. </small>", ""),
        PrependedText("school", "<pre><small>Selectionner l\'établissement. </small></pre>", css_class="selectpicker"),
        PrependedText("year_exam", ""),
        PrependedText("mock_exam", ""))

    class Meta:
        model = Exam
        exclude = ("slug", "user", "nb_views", "name", "status", "creation_date", "deletion_date")

我的看法

def createexam(request):

    # Creation du formulaire + upload des images
    doc_form = CreateExamForm(auto_id=True)

    # Création du formset avec n itération : extra=2
    file_form_set = modelformset_factory(DocumentFile, form=UploadFileForm, extra=1)

    # Récupération du formulaire géré par le mécanisme formset
    #formset = sortedfilesform()

    if request.method == "POST":

        doc_form = CreateExamForm(request.POST)
        files_form = file_form_set(request.POST, request.FILES, queryset=DocumentFile.objects.none())

        if doc_form.is_valid() and files_form.is_valid():
            doc_save = doc_form.save(commit=False)
            doc_save.user = request.user

            for fileform in files_form.cleaned_data:
                image = fileform['file']
                one_image = DocumentFile(document=doc_save, file_value=image)
                one_image.save(commit=False)
            transaction.commit()
            msg = FORM_PROPERTIES.FORM_EXAM_STORED.replace("user", request.user.nickname)
            messages.add_message(request, messages.SUCCESS, msg)
            form = LoginForm()
            context = {'form': form}
            return render_to_response(template_name='login.html', context=context, context_instance=RequestContext(request))
        else:
            messages.add_message(request, messages.SUCCESS, FORM_PROPERTIES.FORM_EXAM_ERROR)
            context = {'doc_form': doc_form, 'file_form_set': file_form_set, }
            return render(request, 'createexam.html', context)
    else:
        context = {'doc_form': doc_form, 'file_form_set': file_form_set, }
        return render(request, 'createexam.html', context)

我的 url.py

urlpatterns = [
    # Examples:
    url(r'^$', home, name='home'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', home),
    url(r'^home', home),
    url(r'^login', login),
    url(r'^logout', logout),
    url(r'^register$', register),
    url(r'^createexam$', createexam),
    url(r'^account/reset_password', reset_password, name="reset_password"),
]

我的模板很简单

<div id="login-overlay" class="modal-dialog">
<div class="row">
    <div class="panel panel-info" >
        <div class="panel-heading">
            <div class="panel-title">Créer un examen</div>
        </div>
        <div class="panel-body" >
            <div class="col-sm-12">
            <form id="post_form" method="POST" action='.'
                  enctype="multipart/form-data">

                {% csrf_token %}
                {% for hidden in doc_form.hidden_fields %}
                    {{ hidden }}
                {% endfor %}

                {% for field in doc_form %}
                    {{ field }} <br />
                {% endfor %}

                {{ file_form_set.management_form }}
                {% for form in file_form_set %}
                    {% crispy form %}
                {% endfor %}
                <input type="submit" value="Add recipe" class="submit" />
            </form>
            </div>
        </div>
    </div>
</div>

在我看来一切都很好。但我的提交不认为。 我在这两天。 我阅读并尝试了很多东西。有人可以帮我吗(对不起我的英语)

【问题讨论】:

标签: django image upload submit formset


【解决方案1】:

当我将主表单正文放入&lt;table&gt; ... &lt;/table&gt;时,我解决了我的问题

<form id="CreateExamForm" method="POST" enctypr="multipart/form-data">
                {% csrf_token %}
                <table>
                    <div class="panel panel-success">
                        <div class="panel-heading">
                            <h3 class="panel-title">Classe - Matière - Date</h3>
                            <span class="pull-right"><i class="glyphicon glyphicon-chevron-up"></i></span>
                        </div>
                        <div class="panel-body">
                            {% crispy doc_form %}

                            {{ file_form_set.management_form }}
                            {% for f_form in file_form_set %}
                                <div class="form-inline">
                                    {% crispy f_form %}
                                </div>
                            {% endfor %}
                        </div>
                    </div>
                </table>
                <input type="submit" value="Add recipe" class="submit" />
            </form>

【讨论】:

    【解决方案2】:

    这里有几个问题。

    首先,您没有在模板中显示表单错误,因此用户无法知道为什么他们的提交无效。确保您在每个字段之后都使用{{ field.errors }},或者在整个表单中同时使用{{ form.errors }};并记住在主窗体和图像窗体集中都这样做。

    其次,您使用 commit=False 保存表单,因此它们不会持久保存到数据库中。如果您想添加未包含在表单中的额外数据,这样做很好,但是您需要记住通过调用例如 doc_save.save() 来实际持久化对象。

    【讨论】:

    • 感谢您的建议。我将修改我的代码。但问题是我什至没有得到我的视图功能。甚至调试模式。按钮什么也不做。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2010-10-29
    • 1970-01-01
    • 2015-04-21
    • 2020-07-12
    • 2015-06-14
    • 2018-09-30
    相关资源
    最近更新 更多