使用超过 1 个参数创建视图 form_valid 时出现 404 错误

404 error on CreateView form_valid with more than 1 arguement

我的证明应用程序 CreateView 有两个参数 "user" 和 "post"。用户需求由 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'),

如果要从视图中的 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() returns None,所以您稍后会在代码中遇到错误。