我希望能够使用模型实例的组/用户来手动发送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吗?如果有人能在这里为我为什么和如何画上清晰的图片,将不胜感激。谢谢!
答案 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
的官方Django文档中找到工作示例。