当字段被禁用时,Django表格变为无效

时间:2018-01-19 22:58:25

标签: python django python-3.x

我正在开发一个django应用程序,用于跟踪我收听过的(音乐)专辑列表,以及我何时听过它们。我正在努力想出如何为特定Listen(另一个模型)创建用于创建Album(我的某个模型)的表单。

Listen的相关部分非常简单:

class Listen(models.Model):
    """A model representing an instance of listening to an album.
    """
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    listen_date = models.DateField(default=datetime.date.today, null=True)

我有一个通用CreateView用于创建没有预先填充数据的视图:

class ListenCreate(generic.edit.CreateView):
    """View for adding a new Listen.
    """
    model = Listen
    form_class = ListenForm
    template_name = 'tracker/generic_form.html'

然后ListenForm看起来像:

class ListenForm(forms.ModelForm):
    class Meta:
        model = Listen
        fields = ['album', 'listen_date']

我创建了一个视图,然后是为特定专辑添加一个listen ,其中相册是从网址中的艺术家和专辑名称中推断出来的:

class ListenCreateForAlbum(generic.edit.CreateView):
    """View for creating a listen for a specific album.
    """
    model = Listen
    form_class = ListenFormForAlbum
    template_name = 'tracker/generic_form.html'

    def get_initial(self):
        initial = copy.copy(self.initial)
        # Get the initial Album using the artist/album names in the URL
        initial['album'] = Album.objects.get(
            name__iexact=unquote_plus(self.kwargs['album_name']),
            artist__name__iexact=unquote_plus(self.kwargs['artist_name']))
        return initial

现在,如果我使用ListenForm作为form_class的{​​{1}},一切都很好,除了选择相册的字段仍然可以编辑。但是,如果我是专门为特定ListenCreateForAlbum添加Listen的网址,我希望修复Album选项。因此,我创建Album表单的唯一目的是使ListenFormForAlbum字段被禁用:

album

此视图呈现正常,但当我尝试提交表单时,我会被重定向回相同的表单页面,并在页面上显示以下错误:

  

选择有效的选择。这个选择不是可用的选择之一。

为什么我收到此消息?有办法解决它吗?

TL; DR:

我想渲染一个表单,用于添加模型,其中预先填充并禁用通过class ListenFormForAlbum(forms.ListenForm): def __init__(self, *args, **kwargs): super(ListenFormForAlbum, self).__init__(*args, **kwargs) self.fields['album'].disabled = True 关系对应于不同模型的字段。以上是我最接近某种解决方案 - 我能够预先填充该字段,但禁用字段以便无法更改它会导致错误表格提交。

0 个答案:

没有答案