我正在开发一个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
此视图呈现正常,但当我尝试提交表单时,我会被重定向回相同的表单页面,并在页面上显示以下错误:
选择有效的选择。这个选择不是可用的选择之一。
为什么我收到此消息?有办法解决它吗?
我想渲染一个表单,用于添加模型,其中预先填充并禁用通过class ListenFormForAlbum(forms.ListenForm):
def __init__(self, *args, **kwargs):
super(ListenFormForAlbum, self).__init__(*args, **kwargs)
self.fields['album'].disabled = True
关系对应于不同模型的字段。以上是我最接近某种解决方案 - 我能够预先填充该字段,但禁用字段以便无法更改它会导致错误表格提交。