无法使用项目ID

时间:2017-11-13 15:42:11

标签: python django

我正在尝试为外键自动分配值,以便模型自动与另一个模型关联。这是在表单创建条目时完成的。我收到以下错误

ValueError at /nodiso/createaction/23/
Cannot assign "'23'": "LeadActions.lead" must be a "Leads" instance.

这是两个模型:

class Leads(models.Model):
    company = models.ManyToManyField(Company)
    user = models.ManyToManyField(settings.AUTH_USER_MODEL)
    name = models.CharField(max_length=265)
    email = models.EmailField(max_length=265)
    tel = models.IntegerField()
    dateenq = models.DateField(auto_now_add=True,null=True)

    def get_absolute_url(self):
      return reverse('nodisoapp:leadlist')

    def __str__(self):
       return self.name

class LeadActions(models.Model):
    lead = models.ForeignKey(Leads)
    name = models.CharField(max_length=265)
    crdate = models.DateField(auto_now_add=True)
    Duedate = models.DateField()
    creator = models.CharField(max_length=265)
    overdue = models.IntegerField(null=True,blank=True)



    def get_absolute_url(self):
      return reverse('nodisoapp:leadlist')

    def __str__(self):
      return self.name

这是视图

class ActionCreateView(LoginRequiredMixin, generic.CreateView):
    login_url = '/scrty/login/'
    template_name = "nodiso/actioncreate.html"
    form_class = forms.LeadActionCreateForm
    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.lead = self.kwargs['pk']
        self.object.creator = self.request.user
        self.object.save()
        return super(LeadCreateView, self).form_valid(form)

这是模型表格

class LeadActionCreateForm(forms.ModelForm):
    class Meta:
        model = models.LeadActions
        fields = ['name','Duedate']

我很感激帮助。

3 个答案:

答案 0 :(得分:2)

而不是

self.object.lead = self.kwargs['pk']

尝试做

lead_id = int(self.kwargs['pk'])
self.object.lead = Lead.objects.get(pk=lead_id)

使用字段名称在Django中分配关系字段时,必须传递模型实例而不是主键。您还可以通过执行以下操作来使用主键:

lead_id = int(self.kwargs['pk'])
self.object.lead_id = lead_id

答案 1 :(得分:1)

试试这个:

self.object.lead_id = self.kwargs['pk']

由于您直接使用键值,因此需要使用'_id'引用变量。

另一种方式是:

self.object.lead_id = Lead.objects.get(pk=self.kwargs['pk'])

在这种情况下不需要,因为你有密钥值。

答案 2 :(得分:1)

这里有两个问题。

一,如果您拥有相关实例的PK而不是实例对象,则需要使用lead_id字段名称。

其中两个,与URI regexp匹配的kwargs是字符串,而PK值是整数。假设您的uris regexp具有适当的限制性,您可以使用int进行转换。所以结合两者:

self.object.lead = int(self.kwargs['pk'])