首页 > 解决方案 > 如何使用模型实例的一些参数初始化表单

问题描述

我希望能够使用模型实例的组/用户手动发送 SMS/电子邮件通知。假设模型如下所示:

class Memo(models.Model):
    title = models.CharField(max_length=100)
    receiver = models.ManyToManyField(EmployeeType, related_name='memos_receiver')

我将对象实例传递给视图:

path('<int:pk>/notify', NotificationView.as_view(), name='memos-notify'),

表单和视图是我遇到麻烦的地方。我想我应该能够在视图中传递表单初始字段:

class NotificationView(FormView):
    template_name = 'memos/notification_form.html'
    form_class = MemoNotificationForm
    success_url = reverse_lazy('overview')

    def get_initial(self):
        initial = super(NotificationView, self).get_initial()
        memo = Memo.objects.filter(id=id)
        initial['receiving_groups'] = memo.receiver.all()
        return initial

表格如下所示:

class MemoNotificationForm(forms.Form):
    class Meta:
        fields = [
            'receiving_groups'
        ]

    receiving_groups = forms.MultipleChoiceField(
        required=False,
        widget=forms.CheckboxSelectMultiple)

*注意:receiving_groups将是收到通知的人。一旦表格有效,我将应用一种send_sms方法发送它。

TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是“builtin_function_or_method”

我需要在表单中初始化查询集吗?如果有人能清楚地了解这里的原因和方式,将不胜感激。谢谢!

标签: djangopython-3.x

解决方案


错误是因为这条线,

memo = Memo.objects.filter(id=id)

在这里,在您的范围内id成为python 的内置功能,因此出现错误。

要访问 URL 参数,您应该使用self.kwargs属性,如下所示

class NotificationView(FormView):
    template_name = 'memos/notification_form.html'
    form_class = MemoNotificationForm
    success_url = reverse_lazy('overview')

    def get_initial(self):
        initial = super(NotificationView, self).get_initial()
        memo = Memo.objects.filter(id=self.kwargs['pk'])
        initial['receiving_groups'] = memo.receiver.all()
        return initial

您可以在此处的 Django 官方文档中找到工作示例,动态过滤


推荐阅读