在Django中上传多张图片以进行单个帖子 [英] Uploading multiple images in Django for a single post

查看:587
本文介绍了在Django中上传多张图片以进行单个帖子的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是django的初学者我想提出一个允许用户记录考试和相关图像的应用程序。



所以我尝试在Django中上传多个图像,根据这个主题单个帖子< a href =http://qasimalbaqali.com/uploading-multiple-images-in-django-for-a-single-post/ =nofollowtitle =http://qasimalbaqali.com/uploading-multiple -images合的django换一个单交/> http://qasimalbaqali.com/uploading-multiple-images-in-django-for-a-single-post/ 。



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

  class Document(models.Model):

class Meta:
db_table ='Document'

slug = models.SlugField(max_length = 100)
user = models.ForeignKey(User)
level = 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)
deleted_date = models.DateTimeField(auto_now_add = False,default = None,null = True)

def __unicode __(self) b $ b return self.name +(+ str(self.status)+)+ self.school.name


class DocumentFile(models.Model):

class我ta:
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'c​​lass ='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 =布局(
PrependedText(matter ,,),
PrependedText(level,< small cl ass ='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,deleted_date)
pre>

我的视图

  def createexam(request):

#创建公式+上传图像
doc_form = CreateExamForm(auto_id = True)

#Créationdu formset avec nitération:extra = 2
file_form_set = modelformset_factory(DocumentFile,form = UploadFileForm,extra = 1)

#Récupérationdu formulairegérépar lemécanismeformset
#formset = sortedfilesform()

如果请求.method ==POST:

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

如果doc_form.is_valid()和files_form.is_valid():
doc_save = doc_form.save(commit = False)
doc_save.user = request.user

在file_form.cleaned_data中的fileform:
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_me ssage(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 = [
#示例:
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-overlayclass =modal-dialog> 
< div class =row>
< div class =panel panel-info>
< div class =panel-heading>
< div class =panel-title>Créerun examen< / div>
< / div>
< div class =panel-body>
< div class =col-sm-12>
< form id =post_formmethod =POSTaction ='。'
enctype =multipart / form-data>

{%csrf_token%}
{%隐藏在doc_form.hidden_​​fields%}
{{hidden}}
{%endfor%}

{%for doc_form%中的字段}
{{field}}< br />
{%endfor%}

{{file_form_set.management_form}}
{%for file_form_set%}
{%crispy form%}
{%endfor%}
< input type =submitvalue =添加食谱class =submit/>
< / form>
< / div>
< / div>
< / div>
< / div>



但我的提交没有想到。
我在这两天。
我阅读并尝试了许多事情。有没有人可以帮助我(对不起我的英文)

解决方案

这里有几件事情错误。

首先,您没有在模板中显示表单错误,因此用户无法知道为什么他们的提交无效。确保您在每个字段后执行 {{field.errors}} ,或执行 {{form.errors}} 为整个表格一次;并记住要做到这一点,形成主窗体和图像形式集。



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


I am beginner in django . I would like to make an application that allows a user to record examinations and related images.

So i try to uploading multiple images in Django for a single post according this topic http://qasimalbaqali.com/uploading-multiple-images-in-django-for-a-single-post/.

But nothing happens when I press the button I explain my models. A document is a generic class. An exam is a document, a document contains files.

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

I create two forms. For exam and for file.

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")

My view

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)

my 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"),
]

My template is simple

<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>

Everything seems good form me. But my submit does no think. I 'm on it for two days. I read and tried many things. Does anybody can help me please (Sorry for my english)

解决方案

There are a couple of things wrong here.

Firstly you are not showing the form errors in the template, so the user has no way of knowing why their submission is invalid. Make sure you either do {{ field.errors }} after every field, or do {{ form.errors }} for the whole form at once; and remember to do this both form the main form and the image formset.

Secondly, you're saving the forms with commit=False, so they are not persisted to the database. It's fine to do that if you want to add extra data not included in the form, but you then need to remember to actually persist the object by calling eg doc_save.save().

这篇关于在Django中上传多张图片以进行单个帖子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆