带有js插件问题的Django图像上传

时间:2019-02-20 10:30:07

标签: django

我正在使用js插件上传图片,这是我第一次从插件中选择图片时提交表单。问题是我第一次选择该图像,但随后我不想要该图像,而是再次单击该图像以上传另一张图像,该表单未通过验证且无法提交。

views.py

class SelectObituaryView(LoginRequiredMixin, TemplateView):
    template_name = "website/obituary_select.html"

    def get_context_data(self, **kwargs):
        context = super(SelectObituaryView, self).get_context_data(**kwargs)
        church_id = self.request.session.get('church_id', None)
        if church_id:
            samples = ObituarySample.objects.filter(organization__id=church_id)
            context['obituary_samples'] = samples
        context['church_cover'] = self.request.session.get('church_cover', None)
        return context

    @transaction.atomic
    def post(self, request):
        print("Entered function")
        try:
            data = request.POST.copy()
            data['organization'] = request.session.get('church_id', None)
            data['slug'] = data['name'].replace(' ', '-')

            data['funeral_time'] = data['funeral_time'].replace(" ", "")
            data['viewing_time'] = data['viewing_time'].replace(" ", "")

            if len(request.FILES.getlist('gallery')) > 10:
                messages.error(request, "Max gallery images limit exceeded.")
                return HttpResponseRedirect(
                    reverse('obituary:create', kwargs={'sample_obituary_id': request.POST.get('obituary_sample')}))



            obituary_form = ObituaryForm(data=data, files=request.FILES)
            # print("obituary form data",data)

            print("before is valid")
            if obituary_form.is_valid():
                print("Inside is_valid")
                obituary_instance = obituary_form.save(commit=False)
                obituary_instance.image = obituary_instance.obituary_sample.background
                obituary_instance.user = request.user
                obituary_instance.save()
                obituary_instance.update_slug_with_id()

                #override profile_image
                #imageName = os.path.basename(obituary_instance.profile_image.path)
                imgArr = os.path.split(obituary_instance.profile_image.path)

                image_data = request.POST['profile_image1']
                b = json.loads(image_data)
                head, data = b["output"]["image"].split(',')
                binary_data = a2b_base64(data)
                print(binary_data)
                with open(obituary_instance.profile_image.path, 'wb+') as fh:
                    myfile = File(fh)
                    myfile.write(binary_data)

                imprinted_image_path = apps.obituary.utils.imprint(obituary_instance, obituary_instance.obituary_sample)

                # Save imprinted image in db
                with open(imprinted_image_path, 'rb') as f:
                    data = f.read()
                file_postfix = datetime.now().strftime("%Y%m%d-%H%M%S")
                obituary_instance.image.save("%s%s.jpg" % ('obituary', file_postfix), ContentFile(data))

                for gallery_image in request.FILES.getlist('gallery'):
                    GalleryImage.objects.create(obituary=obituary_instance, image=gallery_image)

                return HttpResponseRedirect(reverse('obituary:preview', kwargs={'obituary_id': obituary_instance.id}))
            else:
                print("else")
                messages.error(request, constants.OPERATION_UNSUCCESSFUL)
                return HttpResponseRedirect(
                    reverse('obituary:create', kwargs={'sample_obituary_id': request.POST.get('obituary_sample')}))
        except Exception as e:
            print(e)
            print("except")
            messages.error(request, "Unable to create, Please try again.")
            return HttpResponseRedirect(
                    reverse('obituary:create', kwargs={'sample_obituary_id': request.POST.get('obituary_sample')}))

html

{% extends "website/base.html" %}
{% load static %}
{% block javascript %}
  <script>
    // Submit post on submit
{#    $('#create_obit').on('submit', function(event){#}
{#        event.preventDefault();#}
{#        alert("Aamixsh");#}
{#    });#}


    $("#create_obit").submit(function(evt){
        //evt.preventDefault();
        if($(this).find('input[name="profile_image"]').val() != "") {
            $(this).find('input[name="profile_image"]').attr('name','profile_image1');
            $(this).find(".slim").find('input[type="file"]').attr('name','profile_image');
            return true;
        }
    });

    $(document).ready(function(){
        $('input[type="text"]').attr( 'autocomplete', 'off' );
        $('.dateReadonly').attr( 'readonly', 'true' );
    });

  </script>
{% endblock %}

{% block body_block %}
    <!-- Banner Area Start -->
    <div class="banner-area">
        <div class="overlay"></div>
        <div class="img-holder">
            <div class="holder"><img src="{{ church_cover }}" alt=""></div>
        </div>
        <div class="caption">
            <div class="holder">
                <div class="container">
                    <div class="row">
                        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
                            <div class="banner">
                                <h2>Fill in Loved Ones Details</h2>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="section-space">
        <div class="container">
            <div class="row">
                <div class="col-xs-12">
                    <div class="row">
                        <h3 class="heading-title">Create an Obituary</h3>
                        <form class="setting-form" id="create_obit" action="{% url 'obituary:select' %}" method="post" enctype="multipart/form-data">
                        {% csrf_token %}
                            <fieldset>
                                <div class="col-xs-12">
                                    <div class="row">
                                        <div class="col-sm-6">
                                            <div class="form-group">
                                                Name: <input type="text" maxlength="50" name="name" placeholder="Name*" class="form-control input-field" required>
                                            </div>
                                        </div>
                                        <div class="col-sm-6">
                                            <div class="form-group">
                                                Funeral Address: <input type="text" maxlength="50" name="address" placeholder="Funeral Address*" class="form-control input-field" required>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="row">
                                        <div class="col-sm-6">
                                            <div class="form-group">
                                                Date of Birth: <input type="text" id="datepicker1" name="date_of_birth" placeholder="Date of Birth*" class="dateReadonly form-control input-field" required>
                                            </div>
                                        </div>
                                        <div class="col-sm-6">
                                            <div class="form-group">
                                                Date of Death: <input type="text" id="datepicker2" name="date_of_death" placeholder="Date of Death*" class="dateReadonly form-control input-field" required>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="row">
                                        <div class="col-sm-6">
                                            <div class="form-group">
                                                Funeral Date: <input type="text" name="funeral_date" id="datepicker3" placeholder="Funeral Date*" class="dateReadonly form-control input-field" required>
                                            </div>
                                        </div>
                                        <div class="col-sm-6">
                                            <div class="form-group">
                                                Funeral Time: <input type="text" name="funeral_time" id="timepicker" placeholder="Funeral Time*" class="form-control input-field" required>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="row">
                                        <div class="col-sm-6">
                                            <div class="form-group">
                                                Surviving Family: <input type="text" maxlength="100" name="family_info" placeholder="spouse Mary Louise, and sons Joe, Ed, and Tim, etc. (Max Limit: 100 Characters)" class="form-control input-field" required>
                                            </div>
                                        </div>
                                        <div class="col-sm-6">
                                            <div class="form-group">
                                                Ways To Contribute: <input type="text" maxlength="40" name="memorial_donation_info" placeholder="e.g. Donation url or other Information* (Max Limit: 40 Characters)" class="form-control input-field" >
                                            </div>
                                        </div>
                                    </div>
                                    <div class="row">
                                        <div class="col-sm-6">
                                            <div class="form-group">
                                                Viewing Date: <input type="text" name="viewing_date" id="datepicker4" placeholder="Viewing Date*" class="dateReadonly form-control input-field" required>
                                            </div>
                                        </div>
                                        <div class="col-sm-6">
                                            <div class="form-group">
                                                Viewing Time: <input type="text" name="viewing_time" id="timepicker2" placeholder="Viewing Time*" class="form-control input-field" required>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="row">
                                        <div class="col-sm-6">
                                            <div class="form-group">
                                                Viewing Address: <input type="text" maxlength="50" name="viewing_address" placeholder="Viewing Address*" class="form-control input-field" required>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="row">
                                        <div class="col-sm-12">
                                            <div class="form-group">
                                                Message: <textarea maxlength="500" name="message" id="" cols="30" rows="10" class="form-control input-field" placeholder="Message* (Max Limit: 500 Characters)" required></textarea>
                                            </div>
                                        </div>
                                    </div>
                                    <input type="hidden" name="obituary_sample" value="{{ obituary_form.obituary_sample.value  }}" />
                                </div>
                                <div class="col-sm-12">
                                    <h3>Upload Obituary Photo</h3>
                                    <div class = "form-group">
                                        Maximum image size is 8 MB. You can rotate and crop the uploaded image by using the control buttons at the bottom of the image.
                   <!-- original     <input type="file" name="profile_image" placeholder="Obituary Image*" class="form-control input-field" required> -->
                                    <input type="file" name="profile_image" placeholder="Obituary Image*" class="slim" required>
                                   </div> 
                                </div>

                                <div class="col-xs-12">
                                    <h3>Upload Gallery Photos</h3>
                                    <div class="dropzone" id="my-awesome-dropzone">
                                        <div class="fallback">
                                            (Maximum image size should be 8 MB)
                                            <input type="file" name="gallery" multiple class="form-control input-field"/>
                                        </div>
                                    </div>
                                </div>
                                <div class="row">
                                    <div class="col-sm-12">
                                        <div class="form-group">
                                            <input type="checkbox"  onchange="document.getElementById('create').disabled = !this.checked;" /> I understand, that the obituary cannot be edited once paid for!
                                        </div>
                                    </div>
                                </div>
                                <div class="col-xs-12">
                                    <div class="form-group">
                                        <button type="submit" id="create" class="btn send-btn" disabled>Create</button>
                                    </div>
                                </div>
                            </fieldset>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

0 个答案:

没有答案