如何在通用Django CreateView中包含来自另一个模型的对象?

时间:2019-03-14 02:44:07

标签: python django django-views attributes

好吧,所以我试图在我的createAnswer视图中包含相应的注释,当前createAnswer页的网址包含正确的pk ok注释,因此我需要通过url中的ID来获取注释。
 我的通用CreateView如下所示:

class createAnswer(CreateView):
   model = Answer
   fields = ['content']
   def getComment(self, request):
    ???


   comment = getComment()

    def get_success_url(self):
       this_path = self.request.get_full_path()
       path_list = this_path.split('/')
       def get_comment_id(self):
           for i in range(len(path_list)):
               if path_list[i].isdigit():
                   return path_list[i]
       return '/blogcontact/comment/'+ get_comment_id(self)
   def form_valid(self,form):
    this_path = self.request.get_full_path()
    path_list = this_path.split('/')
    def get_comment_id(self):
        for i in range(len(path_list)):
            if path_list[i].isdigit():
                return path_list[i]

    form.instance.author = self.request.user
    form.instance.comment = Comment.objects.get(id=get_comment_id(self))
    return super().form_valid(form)


我的Urls.py看起来像这样:

from django.urls import path
from . import views
from .views import createAnswer

urlpatterns = [
   path('contact/comment/<int:pk>/newanswer', createAnswer.as_view(), 
   name='answer-create')
]<br>

我想将Comment对象保存在一个变量中,以便可以在{{comment}}这样的html模板中使用它

1 个答案:

答案 0 :(得分:0)

我认为您正在使函数视图和基于类的视图(CBV)混淆,并且您从不导入请求,它只是视图接收的参数。

在功能视图中,请执行以下操作:

def my_view(request):
    if request.method == 'POST':
        # do some stuff

对于CBV,每种方法都是一个函数:

from django.views.generic.edit import CreateView


class MyView(CreateView):
    model = Answer
    fields = ['content']

    def get(self, request):
        # do some stuff

    def post(self, request):
        # do some stuff

编辑:要在基于类的视图中访问url参数,请使用self.kwargs,因此您可以通过self.kwargs ['pk']访问注释pk。现在,您只需要获取注释并将其添加到上下文数据中即可:

class CreateAnswer(CreateView):
    model = Answer
    fields = ['content']

    def get_context_data(self, **kwargs):
        kwargs['comment'] = Comment.objects.get(pk=self.kwargs['pk'])
        return super().get_context_data(**kwargs)

    def form_valid(self, form):
        # do some stuff