【问题标题】:Django Error: Reverse for 'image_upload' with no arguments not found?Django 错误:“image_upload”的反向,没有找不到参数?
【发布时间】: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

标签: python django


【解决方案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

【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-12-28
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2021-09-07
    • 2018-05-02
    • 2019-08-03
    • 2019-04-14
    相关资源
    最近更新 更多