首先,我像这样扩展抽象用户:
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模型中的成员字段中?
更新
如何显示全名字段
如果您打算显示它以在之后更改它,则必须覆盖__init__
方法以在两个字段上设置初始数据:也许这个答案可以提供帮助
以及如何通过应用程序数据的视图将这些字段保存到MyModel模型中的成员字段中?
entity = form.save() # this gives you the updated MyModel instance
然后将表单中的数据保存到相关的模型中,如下所示:
entity.member.full_name = form.cleaned_data['full_name']
应该按照:这个答案工作
首先,您可以删除first_name
和last_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"})
这里不使用< 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等)。