首页 > 解决方案 > 在模板中上传图片

问题描述

我的问题是,如果我从管理员上传一张图片,它可以正常工作,但如果我想从我的模板中添加一张图片,我的图片似乎没有上传。在 request.Post 表单中很奇怪,我的图像路径存在。

我没有错误消息...

这是我的模型:

class Listing(models.Model):
    title = models.CharField('Title',max_length=64, blank=False)
    description = models.TextField('Descritpion', blank=False)
    Creation_date = models.DateField(auto_now_add=True)
    enddate= models.DateField('Ending Date', blank=False)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="category")
    initialBid = models.DecimalField('Bid', max_digits=12, decimal_places=2, blank=False)
    photo = ResizedImageField(size=[300, 150], upload_to='images/', default='images/default.jpg')
    active = models.BooleanField('Active', default=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="author")

    def __str__(self):
        return f"{self.id} : {self.title} {self.initialBid} {self.Creation_date}"

    def save(self, *args, **kwargs):

        # Check how the current ending date is after created date,
        d1 = self.Creation_date
        d2 = self.enddate
        if d2 <= d1:
            raise ValueError("End date must be a day after today")
        super(Listing, self).save(*args, **kwargs)

我的表格:

class NewListingForm(forms.ModelForm):
    enddate = forms.DateField(label='Date of auction End', widget=forms.DateInput(format = '%d/%m/%Y'),
                                 input_formats=('%d/%m/%Y',))
    def __init__(self,  *args, **kwargs):
        self._newly_created = kwargs.get('instance') is None
        self.Creation_date = datetime.now()
        super().__init__(*args, **kwargs)


    class Meta:
        model = Listing
        fields = ('title','description','enddate','category','initialBid','photo','active')

我的模板:

<h2>{% if not form.instance.pk %}Create listing {% else %} Edit {% endif %}</h2>
    <form id="create-edit-client" class="form-horizontal"  action="" method="post" accept-charset="utf-8" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.title|as_crispy_field }}

        {{ form.description|as_crispy_field }}

            <br>
        <div class="row">
            <div class="col-3">
            {{ form.category|as_crispy_field }}
            </div>
            <div class="col-2">
            {{ form.initialBid|as_crispy_field }}
            </div>
        </div>
    <br>
        <div class="row">
            <div class="col-3">
                {{ form.enddate|as_crispy_field }}
            </div>

            <div class="col-2">
            {{ form.active|as_crispy_field }}
            </div>

        </div>
    <br>
        {{ form.photo|as_crispy_field }}
            <br>
            <br>

    </form>

在设置中:

STATIC_URL = '/static/'
# gestion ds media
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

在网址中:

urlpatterns = [
   ......
]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我的看法:

@login_required
def editlisting(request, listing_id):
    obj = Listing.objects.filter(pk=listing_id).first()
    if obj is None:
        return render(request, "errors/404.html", {
            "entryTitle": listing_id
        })
    else:
        form = NewListingForm(instance=Listing.objects.get(pk=listing_id))
        modification=True # used in template to check if modification are allowed
        # read only form if not author
        user = request.user.id
        if obj.author.id != user:
            modification=False

        # manage save
        if request.method == "POST":
            form = NewListingForm(request.POST, instance=Listing.objects.get(pk=listing_id))

            if form.is_valid():
                form.save()
                messages.success(request, 'listing saved')  # message for inform user of success - See messages in html file
                return HttpResponseRedirect(reverse("index"))

        # check if in wishes on get
        wishbool=False
        wish = Wishing.objects.filter(item=listing_id, follower=request.user.id).first()
        if wish is not None:
            wishbool = True

        return render(request, 'auctions/newListing.html', {
            "form": form,
            "existing": True,
            'title': "Edit Listing",
            "wishing": wishbool,
            "modification":modification
        })

感谢帮助

标签: djangotemplatesdjango-forms

解决方案


form = NewListingForm(request.POST, request.FILES,instance=Listing.objects.get(pk=listing_id))

推荐阅读