当前位置: 首页 > 知识库问答 >
问题:

如何从其他模型Django中保存对象字段

宋俊艾
2023-03-14

首先,我像这样扩展抽象用户:

class MyProfile(AbstractUser):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    full_name = models.CharField(max_length=255)
    id_number = models.CharField(max_length=14)

    def __str__(self):
        return self.full_name

    def save(self, *args, **kwargs):
        self.full_name = '{0} {1}'.format(self.first_name, self.last_name)
        super().save(*args, **kwargs)

然后参考如下其他模型:

class MyModel(models.Model):
    member = models.OneToOneField(MyProfile, on_delete=models.CASCADE)
    description = models.CharField(max_length=255)

    def __str__(self):
        return self.member

这是形式:

class MyModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    class Meta:
        model = MyModel
        fields = ('description')

    full_name = forms.CharField(required=False, label="", widget=forms.TextInput(attrs={'class': "form-control"}))
    id_number = forms.CharField(required=False, label="", widget=forms.TextInput(attrs={'class': "form-control"}))
    description = forms.CharField(required=False, label="", widget=forms.TextInput(attrs={'class': "form-control"}))

这是视图:

def applicationdata(request):
   if request.method == 'POST':
      form = MyModelForm(request.POST or None) 
      if form.is_valid():
         form.save()
      return HttpResponseRedirect('/index/')
      else:
         print(form.errors)
   else:
      form = MyModelForm()

   context = {
      'form': form,
   }
   return render(request, 'index.html', context)

我的问题是:

> < li>

如何显示全名字段

以及如何通过应用程序数据的视图将这些字段保存到MyModel模型中的成员字段中?

更新

  1. 我更新了AbstractUser模型,因为我忘记添加first_name

共有3个答案

黄弘盛
2023-03-14

如何显示全名字段

如果您打算显示它以在之后更改它,则必须覆盖__init__方法以在两个字段上设置初始数据:也许这个答案可以提供帮助

以及如何通过应用程序数据的视图将这些字段保存到MyModel模型中的成员字段中?

entity = form.save() # this gives you the updated MyModel instance

然后将表单中的数据保存到相关的模型中,如下所示:

 entity.member.full_name = form.cleaned_data['full_name']

应该按照:这个答案工作

周枫涟
2023-03-14

首先,您可以删除first_namelast_name字段,因为您可以从full_name获取它

class MyProfile(AbstractUser):
    full_name = models.CharField(max_length=255)
    id_number = models.CharField(max_length=14)

    def __str__(self) -> str:
        return self.full_name

    @property
    def first_name(self) -> str:
        return self.full_name.split(' ')[0]

    @property
    def last_name(self) -> str:
        if self.full_name.split(' ') > 1:
            return self.full_name.split(' ')[1]
        return ''

class MyModelForm(forms.ModelForm):

    full_name = forms.CharField(required=False, label="", widget=forms.TextInput(attrs={'class': "form-control"}))
    id_number = forms.CharField(required=False, label="", widget=forms.TextInput(attrs={'class': "form-control"}))

    class Meta:
        model = MyModel
        fields = ('description')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['description'].widget = forms.TextInput(attrs={'class': "form-control"})

    def save(self, *args, **kwargs):
        kwargs['commit'] = False
        my_model = super().save(*args, **kwargs)
        MyProfile.objects.update_or_create(
            full_name=self.cleaned_data['full_name'],
            id_number=self.cleaned_data['id_number'],
            mymodel=my_model
        )


如果<code>MyProfile

    def __init__(self, my_profile: MyProfile, *args, **kwargs):
        kwargs.update(initial={
            # 'field': 'value'
            'full_name': my_profile.full_name,
            'id_number': my_profile.id_number
        })
        super().__init__(*args, **kwargs)
        self.fields['description'].widget = forms.TextInput(attrs={'class': "form-control"})
申屠锦
2023-03-14

这里不使用< code>ModelForm,最好使用< code>Form,因为我们并不特别使用模型字段。你的forms.py应该喜欢这个

class MyModelForm(forms.Form):

    full_name = forms.CharField(required=False, label="", widget=forms.TextInput(attrs={'class': "form-control"}))
    id_number = forms.CharField(required=False, label="", widget=forms.TextInput(attrs={'class': "form-control"}))
    description = forms.CharField(required=False, label="", widget=forms.TextInput(attrs={'class': "form-control"}))

而我们的视图方法需要根据需要存储的字段和数据进行完全定制。改变你的观点。py方法

def applicationdata(request):
   if request.method == 'POST':
      form = MyModelForm(request.POST or None) 
      if form.is_valid():
          profile = MyProfile.object.create(full_name=request.POST['full_name'], id_number=request.POST['id_number'])
          if profile is not None:
              MyModel.object.create(description=request.POST['description'], member=profile.pk)
              return HttpResponseRedirect('/index/')
          else:
              form.add_error('profile_out_of_bound', "please try to fill correct details!")

      print(form.errors)
   else:
      form = MyModelForm()

   context = {
      'form': form,
   }
   return render(request, 'index.html', context)

如果这不起作用,请纠正我。

 类似资料:
  • 问题内容: 在数据库中,我想添加另一个对象,它是上述对象的副本。 假设我的桌子有一排。我想用不同的主键将第一行对象插入另一行。我怎样才能做到这一点? 问题答案: 需更改对象的主键并运行save()。 如果要自动生成密钥,请将新密钥设置为“无”。

  • 问题内容: 我有一个Scrapy项目,正在尝试将输出项保存为Django模型定义中的对象(我不使用DjangoItem)。 我正在按此处指定的方式导入Django设置。 在我的Scrapy项目中,我有一个管道类,该类最终处理所有项目并将其保存到数据库中: 但是,发生了一些奇怪的事情,对于第一个项目,我得到了一个错误(请参阅下文)。对于其余项目,一切都很好。假设我要保存7个项目,因此我在第一个保存错

  • 我已经浏览了Python文档提供的信息,但我仍然有点困惑。有人可以发布示例代码来编写一个新文件,然后使用pickle将字典转储到其中吗?

  • 问题内容: 这是我的模特。我想要做的是生成一个新文件,并在保存模型实例时覆盖现有文件: 我看到很多有关如何上传文件的文档。但是,如何生成文件,将其分配给模型字段并将Django存储在正确的位置呢? 问题答案: 你想看看Django文档中的FileField和FieldFile,尤其是FieldFile.save()。 基本上,声明为的字段在访问时为你提供class的实例,该实例为你提供了几种与基础

  • 问题内容: 在保存模型之前,我需要重新调整图片大小。但是,如何检查是否添加了新图片或仅更新了说明,以便每次保存模型时都可以跳过重新缩放? 我只想在加载新图像或更新图像时重新缩放,而在更新说明时不想要。 问题答案: 一些想法: 不确定是否可以在所有伪自动django工具中正常运行(例如:ModelForm,contrib.admin等)。

  • 问题内容: 保存模型之前,我需要重新调整图片大小。但是,如何检查是否添加了新图片或仅更新了说明,以便每次保存模型时都可以跳过重新缩放? 我只想在加载新图像或更新图像时重新缩放,而在描述更新时不想要。 问题答案: 一些想法: 不知道它是否可以在所有伪自动django工具中正常运行(例如:ModelForm,contrib.admin等)。