当前位置: 首页 > 面试题库 >

通过Django中的模型表单保存多对多数据

贲铭
2023-03-14
问题内容

我在从表单保存许多字段时遇到问题。这是我的模型:

class TextIssue(models.Model):
    Issue = models.CharField(max_length=150, unique=True)

    def __unicode__(self):
        return self.Issue

class PadIssue(models.Model):
    Issue = models.CharField(max_length=150, unique=True)

    def __unicode__(self):
        return self.Issue   


class PHIssue(models.Model):
    Data = models.ForeignKey(Data)
    TextIssue = models.ManyToManyField(TextIssue, blank=True, null=True)
    PadIssue = models.ManyToManyField(PadIssue, blank=True, null=True)
    Notes = models.TextField()

    def clean(self):
        from django.core.exceptions import ValidationError
        if self.TextIssue is None and self.PadIssue is None:
            raise ValidationError('You must choose at least one issue category.')   

        if self.Notes is None:
            raise ValidationError('You must write a note regarding the issues selected above.')


class PHIssueForm(ModelForm):

    class Meta:
        model = PHIssue
        exclude = ('Data',)

在这里,我在views.py中处理发布请求:

def process_npiform(request, npi_id=None):

    if npi_id:

        try:
            npi = Data.objects.get(id=int(npi_id))
        except: 

            raise Http404   

    if request.method == 'POST':
        data = DataForm(request.POST, instance=npi, prefix='npi_data')

        if data.is_valid():
            update = data.save(commit=False)

            if not request.user.is_superuser:
                update.User = request.user

            update.save()

            if update.Status == 'past-due':

                try:
                    prefab = PHIssue.objects.get(Data=npi)

                except:
                    prefab = PHIssue(Data=Data.objects.get(id=int(update.id)))
                    prefab.save()

                issue = PHIssueForm(request.POST, instance=prefab, prefix='npi_issue')

                if issue.is_valid():

                    save_issue = issue.save(commit=False)

                    save_issue.save()




            return HttpResponseRedirect(reverse('pm'))

        else:
            return render_to_response('npi/data.html', {'data': data, 'issue': issue}, context_instance=RequestContext(request))    
    else:
        return HttpResponseRedirect(reverse('pm'))

每当我通过表单保存时,只有Notes文本字段都会保存在PHIssue实例中,并且许多字段都是空白。有人可以帮我找出问题所在吗?


问题答案:

使用时commit=False,你必须致电save_m2m()

m2m关系要求先保存父对象,而你并没有使用 commit=False



 类似资料:
  • 问题内容: 我正在编写一个具有People模型的Django应用程序,但遇到了麻烦。我正在使用“多对多”关系将角色对象分配给人们- 角色具有名称和权重。我希望按角色最重的顺序来排列我的人员清单。如果我执行People.objects.order_by(’-roles__weight’),那么当人们被分配了多个角色时,我会得到重复。 我最初的想法是添加一个称为 最重角色权重 的非规范化字段- 并以此

  • 问题内容: 我在保存包含“直通”类表的m2m数据时遇到了麻烦。我想将所有选定的成员(在表单中选择)保存在通过表中。但是我不知道如何在视图中初始化“通过”表。 我的代码: 并在视图中: 我应该如何初始化要正确填充的Membership表的成员资格? 问题答案: 如果使用正常的m2m关系(不通过中间表),则可以替换: 与 但是,在使用中间表的情况下,你需要手动处理POST数据并创建具有所有必填字段的M

  • 问题内容: 我在MySQL数据库中有几个临时表,它们共享相同的架构并具有动态名称。我将如何使用Django与这些表进行交互?一个模型可以从多个表中提取数据吗? 问题答案: 我相信,你可以创建一个工厂函数,该函数将通过动态db_table返回你的模型。 编辑:每次调用此函数时,Django不会创建类属性的新实例。为它创建一个新实例取决于类的名称(Django必须将其缓存在某个地方)。元类可用于在运行

  • 问题内容: 我有两个数据库和两个模型:管理员和用户。 我想将我的模型同步到两个数据库;admin模型到数据库A,用户模型到数据库B; 如果我将模型路径设置为和,则两个模型将同步到默认数据库。 如果我在命令中设置数据库,例如,则两个模型将同步到数据库B。 所以我的问题是,如何将两个模型同步到两个数据库? 问题答案: 我完全同意@alecxe使用数据库路由器。我目前正在使用一个管理界面来管理多个数据库

  • 我有两个数据库和两个模型:管理员和用户。 我想将我的模型同步到两个数据库;管理模型到数据库A,用户模型到数据库B; 如果我将模型路径设置为和,这两个模型将同步到默认数据库。 如果我在命令中设置数据库,比如,那么这两个模型将同步到数据库B。 所以我的问题是,如何将这两个模型同步到两个数据库?

  • 我有下表,目前我可以更新用户对象来添加或删除角色,但我不能在创建新用户时向其添加角色(用户的角色添加到UI上的同一表单上),因为中间表User_Role希望用户的ID为Obj,所以在插入时,我自然得到一个User.user_id=?。 有什么常见的方法可以解决这个问题吗?我在考虑也许尝试在保存后获取插入用户的ID,然后调用更新函数。我不想这样做,因为我担心性能,特别是在未来可能发生批量上传的时候。