默认表单中外部键的值

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)