不是主键的有效值 - ManyToManyField

时间:2015-12-01 13:41:31

标签: python django django-forms

当我尝试使用 models.ManyToManyField 保存ModelForm时,它会抛出错误“值不是主键的有效值”。 此外,我在“ def __init __ ”中设置的初始值仅适用于管理面板,但不适用于前端。

我如何将其配置为仅在数据库中没有数据时显示,但如果数据在其中将显示初始形式(编辑)?通过wa,字段附近没有“+”,那么用户将如何添加值?

forms.py:

class UserprojectForm(forms.ModelForm):
    class Meta:
        model = Userproject
        fields = ['name', 'user', 'description', 'vk_groups', 'source_name', 'date_updated', 'date_until'] #'date_created',  cannot add django.core.exceptions.FieldError: Unknown field(s) (date_created) specified for Userproject
        # widgets = {
        #     'vk_groups': forms.Textarea(attrs={'cols': 80, 'rows': 10}),
        #     'source_name': forms.Textarea(attrs={'cols': 80, 'rows': 5}),
        # }

    def __init__(self, *args, **kwargs):
        super(UserprojectForm, self).__init__(*args, **kwargs)
        #vk_groups = [(v.id,v.buid) for v in Userproject.objects.exclude(buid='').order_by('buid')]
        vk_groups = (('https://vk.com/southitpark','https://vk.com/southitpark'), ('https://vk.com/graphgrail', 'https://vk.com/graphgrail'))
        source_names = (('Вконтакте', 'Вконтакте'), ('Facebook', 'Facebook'), ('Twitter (скоро)', 'Twitter (скоро)'))
        self.fields['vk_groups'].choices = vk_groups
        self.fields['source_name'].choices = source_names

models.py:

    class Userproject(models.Model):
        class Meta:
            verbose_name = u'Проект мониторинга'
            verbose_name_plural = u'Проекты мониторинга'


        vk_groups = models.ManyToManyField(Vkgroupstomonitor, null=True, blank=True, related_name="vkgroups", verbose_name=_("Группы Вконтакте"))
        source_name = models.ManyToManyField(Sourcetomonitor, null=True, blank=True, related_name="sourcename", verbose_name=_("Название источника"))

        name = models.CharField(u'Название проекта', unique=True, max_length=255)
.......

views.py:

class UserprojectCreate(CreateView):
model = Userproject
template_name = 'userproject_form.html'
success_url = reverse_lazy('userproject_list')
fields = ['name', 'description', 'vk_groups', 'source_name', 'date_updated'] 

def form_valid(self, form):
    form.instance.user = self.request.user
    return super(UserprojectCreate, self).form_valid(form) 

1 个答案:

答案 0 :(得分:0)

考虑指定 queryset 而不是选项。后者似乎根本不是this field class设计的一部分。

BTW,在我看来,最好将其包含在表单字段的显式声明中,而不是在 init 方法中修补它们。