gpt4 book ai didi

python - Django:如何将异常从信号转换为 CBV 中的表单错误?

转载 作者:行者123 更新时间:2023-12-01 01:44:42 26 4
gpt4 key购买 nike

由于需要检查 M2M 字段的唯一性,建议我编写一个当 m2m 更改时触发的信号。效果很好。

但是,当使用基于类的 View 创建 Badge 对象时,我想捕获此异常并将其转换为表单错误,以便可以以干净的方式显示错误方式给用户,而不是收到 HTTP 500 错误。

但是我不确定如何以干净的方式做到这一点。通常这很容易,因为它是用模型 clean() 或表单 clean() 自动处理的,但这里不是。

信号.py

@receiver(m2m_changed, sender=Badge.restaurants.through)
def check_uniqueness(sender, **kwargs):
badge = kwargs.get('instance', None)
action = kwargs.get('action', None)
restaurants = kwargs.get('pk_set', None)

if action == 'pre_add':
for restaurant_pk in restaurants:
if Badge.objects.filter(identifier=badge.identifier).filter(restaurants=restaurant_pk):
raise BadgeNotUnique(
f'Badge with identifier {badge.identifier} already exists '
f'for restaurant {Restaurant.objects.get(pk=restaurant_pk)}'
)

views.py

class BadgesCreateView(PermissionRequiredCanHandleBadges, ModelInContextMixin, SubSectionBadges,
BillingClusterMixin,
CreateView):
model = Badge
template_name = "badges/badge_add.html"
fields = ('identifier', 'owner', 'expiration', 'is_active', 'restaurants')
success_url = reverse_lazy('bo:badge-list')

最佳答案

您可以重写 View 的 form_valid 方法,该方法是保存表单(以及实例及其关系)的位置:

class BadgesCreateView(..., CreateView):
# ...
def form_valid(self, form):
try:
return super(BadgesCreateView, self).form_valid(form)
except BadgeNotUnique as e:
form.add_error(
'restaurants', # None for non-field error
e.args[0]
)
return self.form_invalid(form)

关于python - Django:如何将异常从信号转换为 CBV 中的表单错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51506868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com