【问题标题】:Django form: reference fields from foreign keyDjango 表单:来自外键的引用字段
【发布时间】:2019-03-24 17:09:20
【问题描述】:

我正在制作a task tracker webappthe full source code 也可用)并且我有一个数据库结构,其中每个任务都有一个标题、描述和一些实例,每个都可以标记为不完整/不完整:

class Task(models.Model):
    title = OneLineTextField()
    description = models.TextField(blank=True)


class TaskInstance(models.Model):
    task = models.ForeignKey(Task, on_delete=models.CASCADE)
    is_complete = models.BooleanField()

任务和实例可以分开共享,尽管对实例的访问应该意味着对任务的读取访问。这适用于教师创建任务并将其分配给学生的课堂情况。

class TaskPermission(models.Model):
    task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='permissions')
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='task_permissions_granted')
    shared_by = models.ForeignKey(User, on_delete=models.PROTECT, null=True, related_name='task_permissions_granting')
    can_edit = models.BooleanField(default=False)

    class Meta:
        unique_together = 'task', 'user', 'shared_by',


class TaskInstancePermission(models.Model):
    task_instance = models.ForeignKey(TaskInstance, on_delete=models.CASCADE, related_name='permissions')
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='task_instance_permissions_granted')
    shared_by = models.ForeignKey(User, on_delete=models.PROTECT, null=True, related_name='task_instance_permissions_granting')
    can_edit = models.BooleanField(default=False)

    class Meta:
        unique_together = 'task_instance', 'user', 'shared_by',

我的问题是如何为TaskInstances 创建一个表单,其中包含is_complete 的字段,以及Tasktitledescription。像这样的东西会起作用吗?还是我需要实现自己的 saveclean 方法?

class TaskForm(ModelForm):
    class Meta:
        model = TaskInstance
        fields = ('is_complete', 'task__title', 'task__description')

【问题讨论】:

  • 除非你想覆盖它们,否则你不需要实现它们
  • 我不太了解您的要求。任意标题和描述不需要对应于任何Task 实例。简单地从现有任务列表中选择任务会更正常 - 您可以使用标题和/或描述轻松显示它们。这一切都取决于您希望用户界面如何工作。
  • @RobinZigmond 我明白你在说什么。但是,我正在考虑让每个任务都有一个实例列表,所以它朝另一个方向发展。然后可以从任务实例修改任务的标题和描述。我可能会重新考虑这一点,但我想简化每个任务一个实例的情况,不过......
  • 哦,所以您想要一个用于编辑特定TaskInstance 实例的页面,您可以在其中更改底层任务的标题和描述?这是完全可能的(如果您不介意一个实例的“远距离动作”基于相同的Task 影响其他实例) - 在这种情况下,请使用常规的Form 而不是ModelForm 并做所有在您的视图中插入/更新必要的数据库。

标签: python django django-models django-forms django-model-field


【解决方案1】:

我想inlineformset_factory 就是我要找的东西!

其实好像没啥用:是针对同类型的多种形式,不是不同类型的...

【讨论】:

  • @BogdanPrădatu 我不记得了。您可以查看the source code。我现在正在打电话。
  • @BogdanPrădatu 看起来我只是手动实现了它。见main/templates/main/task-instance.htmlmain/views.pyview_task_instance
猜你喜欢
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2010-10-11
  • 1970-01-01
  • 2022-11-13
  • 2019-01-03
相关资源
最近更新 更多