如何使用模型实例的某些参数初始化表单

时间:2019-12-10 03:00:20

标签: django python-3.x

我希望能够使用模型实例的组/用户来手动发送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”

我需要初始化表单中的queryset吗?如果有人能在这里为我为什么如何画上清晰的图片,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

错误是由于此行造成的,

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

在这里,在您的 范围 中, id 变为python's built-in fucntion,因此出现错误。

要访问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

您可以在Dynamic filtering

的官方Django文档中找到工作示例。