标签: django-generic-views

从 CreateView 的 form_valid() 返回而不保存实例

在处理表单提交时,我必须执行自定义逻辑(联系 Web 服务等)。如果失败,我想阻止创建模型 Car 的新实例。

让我们通过一个简单的片段来演示:

from django.views import generic
from django.http import HttpResponseRedirect

class CarCreateView(generic.edit.CreateView):
      model = Car
      form_class = CarForm

      def form_valid(self, form):

           # some logic that may succeed or fail

           if success:
               messages.success(self.request, 'bla bla') 
               return super().form_valid(form)
           else:
               messages.error(self.request, 'blabla')
               # How to return to form index without saving???
               return HttpResponseRedirect(self.get_success_url())
Run Code Online (Sandbox Code Playgroud)

不打电话super().form_valid(form)是不够的。一辆新车仍在保存中。有任何想法吗?

django django-generic-views

1
推荐指数
1
解决办法
2591
查看次数

如何将登录用户传递给direct_to_template?

我正在使用direct_to_template网址,但我需要登录用户才能显示该网页.我怎么把它传递给direct_to_template

django django-views django-generic-views

0
推荐指数
1
解决办法
1535
查看次数

Django detailview get_queryset和get_object

我正在使用Django detailview。最初,我使用URL模式

url(r'^todo/details/(?P<pk>[\d]+)', views.todoDetailView.as_view(), name='detail_todo'),
Run Code Online (Sandbox Code Playgroud)

我的看法是

class todoDetailView(DetailView):
model = models.todo
Run Code Online (Sandbox Code Playgroud)

工作正常。

在第二种情况下,我的网址是

url(r'^todo/details/(?P<id>[\d]+)', views.todoDetailView.as_view(), name='detail_todo'),
Run Code Online (Sandbox Code Playgroud)

这次,我修改了观点

class todoDetailView(DetailView):
model = models.todo
# context_object_name = 'todo_detail'

 def get_object(self, **kwargs):
    print(kwargs)
    return models.todo.objects.get(id=self.kwargs['id'])
Run Code Online (Sandbox Code Playgroud)

效果很好,我将第二种情况修改为

class todoDetailView(DetailView):
model = models.todo
# context_object_name = 'todo_detail'

def get_queryset(self):
    return models.todo.objects.get(id=self.kwargs['id'])
Run Code Online (Sandbox Code Playgroud)

然后我得到一个错误,

通用详细信息视图todoDetailView必须使用对象pk或子弹调用。

我知道没有提供适当的子弹或pk。因此,最初我添加了get_object()(它可以工作),但是get_queryset()不起作用。他们的工作有什么区别?

而且,如果用户仅根据这些信息获取详细信息,我在StackOverflow上读到

可以使用

slug_field = 'param_name'
slug_url_kwarg = 'param_name'
Run Code Online (Sandbox Code Playgroud)

链接- 通用详细信息视图ProfileView必须使用对象pk或子弹调用

任何人都可以向我解释get_object()和get_queryset()的实际工作方式(如果可能的话,还要get_slug_field())

以及条款slug_fieldslug_url_kwarg

提前致谢

django django-generic-views

0
推荐指数
1
解决办法
3166
查看次数

一个 Django DetailView 中的两个模型并按它们之间的关系进行过滤

我有个问题。在我的中,DetailView我想放置来自两个模型的数据。此外,我想过滤它们,我的scenario-detail只有与特定场景相关的评论,由ForeignKey->Scenario相关。

我的views.py

class ScenarioDetailView(LoginRequiredMixin, DetailView):
    model = Scenario

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = Comment.objects.all()
        return context
Run Code Online (Sandbox Code Playgroud)

scenario_detail.html有一个简单的{{ comments }}

我考虑在 中过滤我的评论对象views.py,例如:Comment.objects.get(commentScenario=Scenario.id)但它根本不起作用。

我的models.py

class Scenario(models.Model):
    scenarioTitle = models.CharField(max_length=256)
    scenarioArea = models.ForeignKey(ScenarioArea, on_delete=models.CASCADE)
    scenarioAuthor = models.ForeignKey(User, on_delete=models.CASCADE)
    scenarioDate = models.DateTimeField(default=timezone.now)
    scenarioDescription = models.TextField()

    def __str__(self):
        return self.scenarioTitle

    def get_absolute_url(self):
        return reverse('scenario-detail', kwargs={'pk': self.pk})

class Comment(models.Model):
    commentText = models.CharField(max_length=256)
    commentScenario = models.ForeignKey(Scenario, on_delete=models.CASCADE)
    commentAuthor = …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-views django-generic-views

0
推荐指数
1
解决办法
685
查看次数