默认表单中外部键的值
Default the value of an external key in a form
在用于添加日历(模型“Calendar”)的表单中,在“组”字段中显示了一个下拉菜单,其中包含所有“CalendarGroups”。我希望这个菜单不存在,并且默认情况下使用我通过 url 参数(“group_id”)传递的“组”ID 设置“组”。我该如何解决这个问题?
在models.py中:
class CalendarGroups(models.Model):
name = models.CharField(max_length = 155, blank=True, null=True, unique=True)
def __str__(self):
return str(self.name)
@property
def get_html_url(self):
url = reverse('', args=(self.id,))
return f'<a href="{url}"> {self.name} </a>'
class Calendar(models.Model):
name = models.CharField(max_length=200, unique=True)
#created_by
group = models.ForeignKey(CalendarGroups, on_delete = models.CASCADE, default='')
@property
def get_html_url(self):
url = reverse('cal:calendar_view', args=(self.id, self.group))
return f'<a href="{url}"> {self.name} </a>'
在forms.py中:
class CalendarGroupsForm(ModelForm):
class Meta:
model = CalendarGroups
fields = ('name',)
def __init__(self, *args, **kwargs):
super(CalendarGroupsForm, self).__init__(*args, **kwargs)
class CalendarForm(ModelForm):
class Meta:
model = Calendar
fields = ('name', 'group')
def __init__(self, *args, **kwargs):
super(CalendarForm, self).__init__(*args, **kwargs)
在views.py中:
def group(request, group_id=None):
instance = CalendarGroups()
if group_id:
instance = get_object_or_404(CalendarGroups, pk=group_id)
else:
instance = CalendarGroups()
form = CalendarGroupsForm(request.POST or None, instance=instance)
if request.POST and form.is_valid():
form.save()
return HttpResponseRedirect(reverse('cal:home'))
return render(request, 'cal/form.html', {'form': form})
def calendar(request, group_id=None):
instance = Calendar()
form = CalendarForm(request.POST or None, instance=instance)
if request.POST and form.is_valid():
form.save()
return HttpResponseRedirect(reverse('cal:home'))
return render(request, 'cal/form.html', {'form': form})
在urls.py中:
url(r'^home/(?P<group_id>\d+)/calendar/new/$', views.calendar, name='calendar_new')
您已经将您需要的 group_id 密钥发送到 views.calendar。
现在尝试将其添加到 form.save
之前的表单中
在view.py
中尝试这样修改
def calendar(request, group_id):
instance = Calendar()
form = CalendarForm(request.POST or None, instance=instance)
if request.POST and form.is_valid():
form.group=group_id
form.save()
return HttpResponseRedirect(reverse('cal:home'))
return render(request, 'cal/form.html', {'form': form})
请注意,这可能会覆盖用户在 CalendarForm 上可以 post 的内容,您应该考虑隐藏或不可编辑 group_id,
这也与我通常做的略有不同,但它应该有效
我 Post 还有一个对我有用的例子:
def calendar(request, group_id):
instance = Calendar()
form = CalendarForm(request.POST or None)
if request.POST and form.is_valid():
instance = form.save(commit=False)
instance.group = group_id
instance.save()
return HttpResponseRedirect(reverse('cal:home'))
return render(request, 'cal/form.html', {'form': form})
参考了documentation,我通过修改代码如下解决:
在views.py中:
def calendar(request, group_id=None):
instance = Calendar()
instance = Calendar(group_id=group_id)
form = CalendarForm(request.POST or None, instance=instance)
if request.POST and form.is_valid():
form.save()
return HttpResponseRedirect(reverse('cal:home'))
return render(request, 'cal/form.html', {'form': form})
在forms.py中:
class CalendarForm(ModelForm):
class Meta:
model = Calendar
fields = ('name',)
def __init__(self, *args, **kwargs):
super(CalendarForm, self).__init__(*args, **kwargs)
在用于添加日历(模型“Calendar”)的表单中,在“组”字段中显示了一个下拉菜单,其中包含所有“CalendarGroups”。我希望这个菜单不存在,并且默认情况下使用我通过 url 参数(“group_id”)传递的“组”ID 设置“组”。我该如何解决这个问题?
在models.py中:
class CalendarGroups(models.Model):
name = models.CharField(max_length = 155, blank=True, null=True, unique=True)
def __str__(self):
return str(self.name)
@property
def get_html_url(self):
url = reverse('', args=(self.id,))
return f'<a href="{url}"> {self.name} </a>'
class Calendar(models.Model):
name = models.CharField(max_length=200, unique=True)
#created_by
group = models.ForeignKey(CalendarGroups, on_delete = models.CASCADE, default='')
@property
def get_html_url(self):
url = reverse('cal:calendar_view', args=(self.id, self.group))
return f'<a href="{url}"> {self.name} </a>'
在forms.py中:
class CalendarGroupsForm(ModelForm):
class Meta:
model = CalendarGroups
fields = ('name',)
def __init__(self, *args, **kwargs):
super(CalendarGroupsForm, self).__init__(*args, **kwargs)
class CalendarForm(ModelForm):
class Meta:
model = Calendar
fields = ('name', 'group')
def __init__(self, *args, **kwargs):
super(CalendarForm, self).__init__(*args, **kwargs)
在views.py中:
def group(request, group_id=None):
instance = CalendarGroups()
if group_id:
instance = get_object_or_404(CalendarGroups, pk=group_id)
else:
instance = CalendarGroups()
form = CalendarGroupsForm(request.POST or None, instance=instance)
if request.POST and form.is_valid():
form.save()
return HttpResponseRedirect(reverse('cal:home'))
return render(request, 'cal/form.html', {'form': form})
def calendar(request, group_id=None):
instance = Calendar()
form = CalendarForm(request.POST or None, instance=instance)
if request.POST and form.is_valid():
form.save()
return HttpResponseRedirect(reverse('cal:home'))
return render(request, 'cal/form.html', {'form': form})
在urls.py中:
url(r'^home/(?P<group_id>\d+)/calendar/new/$', views.calendar, name='calendar_new')
您已经将您需要的 group_id 密钥发送到 views.calendar。 现在尝试将其添加到 form.save
之前的表单中在view.py
中尝试这样修改def calendar(request, group_id):
instance = Calendar()
form = CalendarForm(request.POST or None, instance=instance)
if request.POST and form.is_valid():
form.group=group_id
form.save()
return HttpResponseRedirect(reverse('cal:home'))
return render(request, 'cal/form.html', {'form': form})
请注意,这可能会覆盖用户在 CalendarForm 上可以 post 的内容,您应该考虑隐藏或不可编辑 group_id, 这也与我通常做的略有不同,但它应该有效 我 Post 还有一个对我有用的例子:
def calendar(request, group_id):
instance = Calendar()
form = CalendarForm(request.POST or None)
if request.POST and form.is_valid():
instance = form.save(commit=False)
instance.group = group_id
instance.save()
return HttpResponseRedirect(reverse('cal:home'))
return render(request, 'cal/form.html', {'form': form})
参考了documentation,我通过修改代码如下解决:
在views.py中:
def calendar(request, group_id=None):
instance = Calendar()
instance = Calendar(group_id=group_id)
form = CalendarForm(request.POST or None, instance=instance)
if request.POST and form.is_valid():
form.save()
return HttpResponseRedirect(reverse('cal:home'))
return render(request, 'cal/form.html', {'form': form})
在forms.py中:
class CalendarForm(ModelForm):
class Meta:
model = Calendar
fields = ('name',)
def __init__(self, *args, **kwargs):
super(CalendarForm, self).__init__(*args, **kwargs)