【问题标题】:Image not being replaced when updating Django ImageField更新 Django ImageField 时未替换图像
【发布时间】:2020-11-19 09:27:37
【问题描述】:

我正在使用 Django 编写博客,我正在尝试使用 ModelForm 更新我的模型 BlogPost 的图像。

最初,在创建帖子时,图片正在上传,媒体/帖子中没有问题。但是,当尝试用另一张图片更新现有图片(或将图片添加到已经创建但没有图片的帖子)时,没有任何反应。

我在网上找到了解决这个问题的方法,那就是覆盖模型的 save() 方法。我这样做了,但似乎仍然没有发生任何事情。很明显,我做错了什么。

我的代码如下:

views.py:

def blog_post_update_view(request,slug):
    obj = get_object_or_404(BlogPost.objects.filter(user=request.user), slug=slug)
    form = BlogPostModelForm(request.POST or None, instance=obj)
    if form.is_valid():
        form.save()
    
        print(obj.image)
        return redirect(obj.get_absolute_url()+"/detail/")
    template_name = 'blog/form.html'
    context = {"title": f"Update {obj.title}", "form": form}
    return render(request, template_name, context) 

models.py:

class BlogPost (models.Model):
    # id = models.IntegerField() # pk
    user= models.ForeignKey(User, default=1, null=True, on_delete=models.SET_NULL)
    image=models.ImageField(  upload_to='posts/',blank=True,null=True)
    title=models.CharField(max_length=120)
    slug= models.SlugField() # hello world -> hello-world
    content=models.TextField(null=True,blank=True)
    publish_date=models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True)
    timestamp=models.DateTimeField(auto_now_add=True)
    updated=models.DateTimeField(auto_now=True)

    objects = BlogPostManager()

    class Meta:
        ordering = ['-publish_date', '-updated', '-timestamp']
    
    def get_content_length(self):
        return len(self.content)

    def get_absolute_url(self):
        return f"/blog/{self.slug}"

    def get_edit_url(self):
        return f"{self.get_absolute_url()}/edit"

    def get_delete_url(self):
        return f"{self.get_absolute_url()}/delete"

    def save(self, *args, **kwargs):
        try:
            this = BlogPost.objects.get(id=self.id)
            if this.image!= self.image:
                this.image.delete()
        except: pass
        super(BlogPost, self).save(*args, **kwargs)

    def __str__(self):
        return self.title

forms.py:

class BlogPostModelForm(forms.ModelForm):
    class Meta:
        model = BlogPost
        fields = ['title','image', 'slug', 'content', 'publish_date']

    def clean_title(self, *args, **kwargs):
        instance = self.instance
        print('instance is: ',instance)
        title = self.cleaned_data.get('title')
        qs = BlogPost.objects.filter(title__iexact=title)
        if instance is not None:
            qs = qs.exclude(pk=instance.pk) # id=instance.id

        if qs.exists():
            raise forms.ValidationError("This title has already been used. Please try again.")
        return title

博客/模板/form.html:

<!doctype html>
{% extends "blog/base.html" %}
{% load static %}
{% load crispy_forms_tags %}

{% block head_title %}
{{title}}
{% endblock %}

{% block content %}

{% if title %}
    <h1>{{ title }}</h1>
{% endif %}

<form method='POST' enctype="multipart/form-data" action='.'> {% csrf_token %}
    {{ form|crispy}}
    <button type='submit'>Send</button>
</form>


{% endblock %}


【问题讨论】:

    标签: django django-models django-forms django-views django-templates


    【解决方案1】:

    你的观点应该是这样的:

    def blog_post_update_view(request,slug):
        obj = get_object_or_404(BlogPost.objects.filter(user=request.user), slug=slug)
        
        if request.method == "POST":
            form = BlogPostModelForm(request.POST, request.FILES, instance=obj)
            if form.is_valid():
                form.save()
                return redirect(obj.get_absolute_url()+"/detail/")
    
        form = BlogPostModelForm(instance=obj)
        template_name = 'blog/form.html'
        context = {"title": f"Update {obj.title}", "form": form}
        return render(request, template_name, context) 
    

    【讨论】:

    • 当然,request.FILES,忘记添加那个了。现在它可以工作 10 倍!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2011-02-22
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多