gpt4 book ai didi

python - Django : Can I Pre-fill forms with a model instance datas in form. py?

转载 作者:行者123 更新时间:2023-11-28 17:04:11 26 4
gpt4 key购买 nike

我已经在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com