在处理表单提交时,我必须执行自定义逻辑(联系 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)是不够的。一辆新车仍在保存中。有任何想法吗?
我正在使用direct_to_template网址,但我需要登录用户才能显示该网页.我怎么把它传递给direct_to_template?
我正在使用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_field和slug_url_kwarg
提前致谢
我有个问题。在我的中,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