- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经在 views.py 文件中看到了一种方法来做我想做的事情,但由于我可能会在几个不同的地方使用该表单,并且因为我相信它更属于 forms.py,我想知道我是否以及如何在不修改 View 的情况下为一个特定用户使用已经存储在数据库中的数据预填充我的表单。看到我的尝试不言而喻:
模型.py:
class Customers(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='details')
city = models.CharField(max_length=50, blank=True, null=True)
dpt = models.IntegerField(blank=True, null=True)
adress = models.CharField(max_length=100, blank=True, null=True)
cplt_add = models.CharField(max_length=100, blank=True, null=True)
phone = models.CharField(max_length=14, blank=True, null=True)
表格.py:
class CustomerForm(ModelForm):
def __init__(self):
for field in self.fields:
user_infos = Customers.objects.get(pk=request.user.details.id)
initial_value = user_infos.field
field(initial=initial_value)
def clean_form(self):
...
class Meta:
model = Customers
fields = ['city', 'adress', 'dpt', 'cplt_add', 'phone']
widgets = {
'city': TextInput(attrs={
'class': 'form_input',
'placeholder': 'Ville'}),
'dpt': TextInput(attrs={
'class': 'form_input',
'placeholder': 'Département'}),
'adress': TextInput(attrs={
'class': 'form_input',
'placeholder': 'Adresse'}),
'cplt_add': TextInput(attrs={
'class': 'form_input',
'placeholder': "Complément d'adresse"}),
'phone': TextInput(attrs={
'class': 'form_input',
'placeholder': 'Téléphone'}),
}
这段代码,遗憾但并不意外,返回:
'CustomerForm' object has no attribute 'fields'
关于如何使用良好实践方法做到这一点的任何建议?
最佳答案
你在错误的层次上解决了这个问题:Django 已经支持这个,你自己在 __init__
中编写它是不是一个好主意(除了一些特定的edge- 和corner cases)。
因此,您可以从 ModelForm
中删除 __init__
覆盖:
# app/forms.py
class CustomerForm(ModelForm):
# remove the __init__ override
class Meta:
model = Customers
fields = ['city', 'adress', 'dpt', 'cplt_add', 'phone']
widgets = {
'city': TextInput(attrs={
'class': 'form_input',
'placeholder': 'Ville'}),
'dpt': TextInput(attrs={
'class': 'form_input',
'placeholder': 'Département'}),
'adress': TextInput(attrs={
'class': 'form_input',
'placeholder': 'Adresse'}),
'cplt_add': TextInput(attrs={
'class': 'form_input',
'placeholder': "Complément d'adresse"}),
'phone': TextInput(attrs={
'class': 'form_input',
'placeholder': 'Téléphone'}),
}
在 View 中(或者其他你想构建表单的地方),我们可以通过构造函数的instance=
参数传递实例:
# app/views.py
def my_view(request):
customer=Customers.objects.get(pk=request.user.details.id)
my_form = CustomerForm(<b>instance=customer</b>)
# ...
# return HttpResponse object
然后 Django 将确保以正确的形式填写值(就好像它是 initial
值一样)。如果您同时提供 initial
值和 instance
,则 initial
优先,如 documentation on the ModelForm
中所述:
As with regular forms, it's possible to specify initial data for forms by specifying an
initial
parameter when instantiating the form. Initial values provided this way will override both initial values from the form field and values from an attached model instance.
关于python - Django : Can I Pre-fill forms with a model instance datas in form. py?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52245448/
我是一名优秀的程序员,十分优秀!