如何在Django内联表单集的clean方法中获取request对象?
如何在Django内联表单集的clean方法中访问request对象?
当然可以做到啦!Django默认确实没把request对象自动传递给内联表单集,但咱们只需要几步简单的配置就能搞定,我给你拆解下具体操作:
针对Django Admin场景的解决方案
第一步:在Admin类中重写get_formset方法传递request
在你的InvoiceAdmin类里,添加一个get_formset方法,把当前请求对象绑定到表单集上:
class InvoiceAdmin(admin.ModelAdmin): inlines = [InvoiceLineInline, ] form = InvoiceForm def get_formset(self, request, obj=None, **kwargs): # 先调用父类方法获取默认的表单集 formset = super().get_formset(request, obj, **kwargs) # 将request绑定到表单集实例上 formset.request = request return formset
第二步:在表单集的clean方法中访问request
现在你就可以在InvoiceLineInlineFormset的clean方法里直接通过self.request访问请求对象了,比如获取当前登录用户:
class InvoiceLineInlineFormset(forms.models.BaseInlineFormSet): def clean(self): super(InvoiceLineInlineFormset, self).clean() # 直接访问request对象 current_user = self.request.user # 接下来就可以结合request做你的验证逻辑了 count = 0 # ... 你的其他clean代码
普通视图场景的补充方案
如果是在自定义视图中使用内联表单集,只需要在实例化表单集时手动把request绑定上去即可:
from django.forms import inlineformset_factory def invoice_edit_view(request, invoice_id): invoice = Invoice.objects.get(pk=invoice_id) # 定义内联表单集类 InvoiceLineFormSet = inlineformset_factory(Invoice, InvoiceLine, formset=InvoiceLineInlineFormset) if request.method == 'POST': formset = InvoiceLineFormSet(request.POST, request.FILES, instance=invoice) # 绑定request到表单集 formset.request = request if formset.is_valid(): formset.save() # ... 后续处理逻辑 else: formset = InvoiceLineFormSet(instance=invoice) formset.request = request # ... 其他视图代码
小提示:使用request对象时,记得做好权限校验,比如确认当前用户有操作该数据的权限,避免安全问题哦!
内容的提问来源于stack exchange,提问作者Sencer H.
相关产品推荐
相关产品推荐

