Django 错误:“image_upload”的反向,没有找不到参数?

Posted

技术标签:

【中文标题】Django 错误:“image_upload”的反向,没有找不到参数?【英文标题】:Django Error: Reverse for 'image_upload' with no arguments not found? 【发布时间】:2021-03-29 13:02:55 【问题描述】:

我正在尝试将主键作为 URL 参数从 CreatePost 传递到 UploadImage 视图,但即使我在 URL 中看到主键,我也会不断收到错误消息。我是 Django 的新手,所以请帮助我:) views.py

    class CreatePost(CreateView):
    model=shopModels.UserPost
    template_name='shop/create_post.html'
    fields='__all__'
    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.fields['category'].widget.attrs['class'] = 'form-control'
        form.fields['category'].widget.attrs['oninvalid']="this.setCustomValidity('Ovo polje je obavezno!')"
        return form
    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return redirect('login')
        return super(CreatePost, self).dispatch(request, *args, **kwargs)
    def get_success_url(self):
        return reverse('image_upload',kwargs='user_post':self.object.id)
    
class UploadImage(CreateView):
    model=shopModels.Image
    template_name='shop/images_upload.html'
    fields='__all__'
    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return reverse('login')
        return super(UploadImage, self).dispatch(request, *args, **kwargs)

urls.py ...

path('create_post/',views.CreatePost.as_view(),name="create_post"),
path('image_upload/<int:user_post>',views.UploadImage.as_view(),name="image_upload"),

...

models.py

class UserPost(models.Model):
id = models.AutoField(primary_key=True)
user=models.ForeignKey(Account,on_delete=models.CASCADE)
title=models.CharField(max_length=255)
text=models.TextField(null=True)
category=models.ForeignKey(Category,null=True,on_delete=models.SET_NULL)
is_used=models.BooleanField(default=False)
price=models.IntegerField(default=0)
created_at = models.DateField(auto_now_add=True)
updated_at = models.DateField(auto_now=True)
is_active = models.BooleanField(default=True)
def __str__(self):
    return self.title + ' | ' + str(self.user)
def get_absolute_url(self,*args,**kwargs):
    return reverse('image_upload', kwargs='user_post':self.id)
    

class Image(models.Model):
     id = models.AutoField(primary_key=True)
     user_post=models.ForeignKey(UserPost,default=None, on_delete=models.CASCADE)
     image=models.ImageField(null=True,blank=True,upload_to='images/')
     def __str__(self):
        return self.user_post.title
     def get_absolute_url(self):
        return reverse('index')

编辑!!!

NoReverseMatch at /image_upload/23

没有找到没有参数的“image_upload”反向。尝试了 1 种模式:['image_upload/(?P[0-9]+)$'] 请求方法:GET 请求网址:http://127.0.0.1:8000/image_upload/23 Django 版本:3.1.4 异常类型:NoReverseMatch 异常值: 未找到任何参数的“image_upload”反向。尝试了 1 种模式:['image_upload/(?P[0-9]+)$'] 异常位置:C:\Users\marij\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\urls\resolvers.py,第 685 行,_reverse_with_prefix Python 可执行文件:C:\Users\marij\AppData\Local\Programs\Python\Python38-32\python.exe Python 版本:3.8.3

【问题讨论】:

您帖子标题中的错误与您的代码不匹配。你能包括完整的stacktrack吗?目前,您的代码提供 kwargs 来反转,但错误表示未提供任何参数。有什么事情没有排队。 我刚刚编辑了一个帖子。我想这是一个愚蠢的问题,但我在 Django 中真的很新,真的很困惑.. 错误说没有提供任何参数,但我在 url 中看到了 id 【参考方案1】:

我认为你没有在 html 表单中包含 user_post 键,你应该在 jinja 样式中包含它

&lt;a class="btn btn-success" href="% url 'image_upload' user_post=user_post_key %"&gt;

如果你想基于user_post做一些操作,你应该重写form_valid(self)方法并使用self.kwargs['user_post']访问int:user_post

【讨论】:

我尝试覆盖 form_valid 方法,但没有帮助。问题是我在 Jinja 模板中没有任何 标记导致该 url。它的工作原理如下:当我在 CreatePost 视图中创建帖子时,它会自动将创建的帖子的 id 传递给 UploadImage 视图(至少应该如此)。我在 url 中看到了 id,但我不明白参数发生了什么......【参考方案2】:

您的路径明确期望 user_post 为整数:

 path('image_upload/<int:user_post>',views.UploadImage.as_view(),name="image_upload"),

如果您调用 reverse(...) 并移交 123,您需要确保 123 是整数类型,而不是例如字符串。

【讨论】:

以上是关于Django 错误:“image_upload”的反向,没有找不到参数?的主要内容,如果未能解决你的问题,请参考以下文章

JS 上传图片转换成二进制流base64

Ruby中的图像上传

使用 jcrop 和 CodeIgniter 裁剪图像

Django 和 AngularJS:如何显示来自 Django 调试错误消息的 Angular $http 错误

django debug关闭之后网页错误

Django 错误:关系 django_admin_log 的权限被拒绝