【问题标题】:Django - preset foreign key value in form fieldDjango - 在表单字段中预设外键值
【发布时间】:2018-11-28 20:26:49
【问题描述】:

我正在努力解决这个问题,希望这里有人可以帮助我。我有一个名为“Team”的模型,它有一个 ForeignKey 字段,该字段对应于我在(“Department”)上显示 ModelForm 的页面。由于它在页面上,我想在后端(视图或表单)中设置 ForeignKey,而不是让用户选择它。

按照其他示例进行设置,以便将值添加到表单部分,但是当我提交表单时,我在终端中收到以下错误(随后是 request.POST 打印输出):

<ul class="errorlist"><li>Department<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

<QueryDict: {'csrfmiddlewaretoken': ['KeEJF7KFr6l9dbkmZWA7u4Qg3eKqqFGcB2qq2AIEmilLP87AySi60ig3hJl6TBS0'], 'title': ['test'], 'description': [''], 'events': [''], 'current_status': [''], 'notes': [''], 'impact': [''], 'timeliness': [''], 'likelihood': [''], 'risk': [''], 'summary': [''], 'documents': ['']}>

表格:

class TeamFormCreate(forms.ModelForm):

    class Meta:
        model = Team
        fields = ('department', 'title', 'description', 'events', 'current_status', 'notes', 'impact',
                  'timeliness', 'likelihood', 'risk', 'summary', 'documents')

查看:

@login_required
def new_team(request):

    if request.method == "POST":
        form = TeamFormCreate(request.POST)
        if form.is_valid():
            team = form.save(commit=False)
            team.author = request.user
            team.modified_date = timezone.now()
            team.save()
            return redirect('/dashboard/1')
        else:
            return redirect('/dashboard/1')

    else:
        cd_id = request.GET.get('id', None)
        form = TeamFormCreate(cd_id)
        return render(request, 'app/sidebar_team.html', {'form': form}) 

型号:

class Team(models.Model):
    department = models.ForeignKey('MyApp.Department', related_name='teams')
    author = models.ForeignKey('auth.User')
    modified_date = models.DateTimeField(default=timezone.now)
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True, null=True)
    events = models.TextField(blank=True, null=True)
    current_status = models.TextField(blank=True, null=True)
    notes = models.TextField(blank=True, null=True)
    order = models.IntegerField(default=0)
    # icon = models.ImageField()

    # Document files
    summary = models.FileField(upload_to='team', blank=True, null=True)
    documents = models.FileField(upload_to='team', blank=True, null=True)

    # Ratings
    RATING_CHOICES = [(x, x) for x in range(1, 6)]
    impact = models.IntegerField(choices=RATING_CHOICES, blank=True, null=True)
    timeliness = models.IntegerField(choices=RATING_CHOICES, blank=True, null=True)
    likelihood = models.IntegerField(choices=RATING_CHOICES, blank=True, null=True)
    risk = models.IntegerField(choices=RATING_CHOICES, blank=True, null=True)

    class Meta:
        ordering = ['order']

    def __str__(self):
        return self.title

【问题讨论】:

  • 我不知道这是否只是一个错字,但在你的模型中你有DepartMent(大写的M)和你的形式Department(只是大写)。
  • 这是我在屏蔽模型名称时打错了。
  • 也许你可以看到这个问题有类似的问题stackoverflow.com/a/49463287/924300
  • @DimitrisKougioumtzis 感谢您的建议,它让我得到了正确的答案。我没有从模型中传递标题,而是传递了模型的 pk 并做到了。
  • 在您的班级团队中将外键部门更改为小写部门

标签: django django-forms


【解决方案1】:

我终于能够通过将我的视图从基于函数的视图更改为以下基于类的视图来完成这项工作。

# Required Imports
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin

class TeamCreate(LoginRequiredMixin, CreateView):
    model = Team
    form_class = TeamFormCreate
    template_name = 'app/sidebar_team.html'

    def get_initial(self):
        pk = self.request.GET.get('id')
        return {
            'department': pk,
        }

    def post(self, request, *args, **kwargs):
        form = TeamFormUpdate(request.POST)
        if form.is_valid():
            team = form.save(commit=False)
            team.author = request.user
            team.modified_date = timezone.now()
            team.save()
            return redirect('/dashboard/' + str(team.department.id))
        else:
            return redirect('/dashboard/' + str(form.department.id))

【讨论】:

    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2010-10-11
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多