【问题标题】:404 error on CreateView form_valid with more than 1 arguementCreateView form_valid 上的 404 错误,参数超过 1 个
【发布时间】:2018-10-02 03:16:48
【问题描述】:

我的证明 App 的 CreateView 接受 2 个参数“用户”和“帖子”。 self.object.user = self.request.user 满足用户要求 我如何满足self.object.post 要求。我是 Django 的新手。如果我违反了任何 Django 规则,我深表歉意

models.py

User = get_user_model() 
class Proof(models.Model):
    user = models.ForeignKey(User, related_name='proofmade')
    post = models.ForeignKey(Post, related_name='proofmade')
    made_at = models.DateTimeField(auto_now=True)
    image_of_task= models.ImageField()
    proof_you_made_it = models.ImageField()
    suggestions = models.TextField(max_length=1000)

def __str__(self):
    return self.post.title

views.py

User = get_user_model()
class ProofCreate(LoginRequiredMixin, CreateView):
   model = Proof
   fields = ('image_of_task', 'proof_you_made_it', 'suggestions')

   def form_valid(self, form, *args, **kwargs):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        ###### I think the following line may be wrong ##########
        slug = self.kwargs.get('slug')     
        print(slug)
        self.object.post = get_object_or_404(Post, slug=slug)
        self.object.save()
        return super().form_valid(form)

urls.py

app_name = 'proof'

urlpatterns = [
    url(r'^new_proof/$', views.ProofCreate.as_view(), name='new_proof'),

【问题讨论】:

  • 请显示网址格式。
  • @Alasdair 我已按要求添加了 URL 模式。它创建了一个表单,让我可以附加图像,当我点击提交时,它会出现 404 错误
  • @Alasdair 你认为我在 slug = self.kwargs.get('slug') 上犯了一个错误吗?我一直在尝试 shell 中的所有不同选项,试图弄清楚如何将帖子与证明
  • 你希望从哪里得到蛞蝓?正则表达式 r'^new_proof/$ 中没有 slug。
  • @Alasdair 我尝试了 2 种不同的 url 模式(见上文)。知道如何在 url 中调用 post slug。 “post.slug”不起作用。

标签: python django python-3.x django-views django-urls


【解决方案1】:

如果要在视图中从self.kwargs 访问slug,则需要在URL 中使用slug。例如:

url(r'^new_proof/(?P<slug>[-\w]+)/$', views.ProofCreate.as_view(), name='new_proof')

您不需要username,因为您从self.request.user 获取用户。在您的第二次尝试中,post.slug 不正确,因为变量名不能包含点。

在视图中,我会使用slug = self.kwargs['slug'],除非您希望它是可选的。目前get() 返回None,因此您稍后会在代码中遇到错误。

【讨论】:

  • 我也尝试过。 /posts/admin/tieing-a-knot/ 的 NoReverseMatch 为“new_proof”反向,未找到任何参数。尝试了 1 种模式:['proof/new_proof/(?P[-\\w]+)/$'] 请求方法:GET
  • 您认为这可能是因为当您说 slug 时,它正在寻找证明 slug。但在证明模型中,您可以看到证明没有属性 slug。这篇文章有一个蛞蝓。 post & user 也是 Proof 的外键
  • with url(r'^new_proof/$', views.ProofCreate.as_view(), name='new_proof'), (old URL) 表单显示它允许我添加图像然后当我点击提交。我收到错误您是否认为更改 form_valid 中的某些内容可能是 slug = self.kwargs.get('slug')。如果我在 url 中添加 slug,则表单不会显示
  • 不,我已经解释了为什么你不应该使用self.kwargs.get('slug'). NoReverseMatch at /posts/admin/tieing-a-knot/ 错误是一个不同的问题,它发生在不同的视图/模板上。
  • 你能告诉我可以用什么来代替 self.kwargs.get('slug')。我想不通。我一直在尝试使用“related_name”以某种方式使其工作
猜你喜欢
  • 2018-04-07
  • 2016-03-23
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多