如何在详细视图中获取主键并用于预填充表单中的隐藏字段?
How to get primary key inside detailview and use to pre fill a hidden field in a form?
我有两个模型:Properties 和 Bedroom,它们通过 Bedroom 模型上的外键 "Property" 连接。
#models.py
class Property(models.Model):
property_reference = models.CharField(db_column='Property_Reference', max_length=10, unique=True) # Field name made lowercase.
address = models.CharField(db_column='Address', max_length=250, blank=True, null=True) # Field name made lowercase.
post_code = models.CharField(db_column='Post_Code', max_length=15, blank=True, null=True) # Field name made lowercase.
type = models.CharField(db_column='Type', max_length=25, blank=True, null=True, choices=HOUSE_TYPE_CHOICES) # Field name made lowercase.
bedrooms = models.IntegerField(db_column='Bedrooms', blank=True, null=True) # Field name made lowercase.
bathrooms = models.IntegerField(db_column='Bathrooms', blank=True, null=True) # Field name made lowercase.
usual_cleaning_requirements = models.CharField(db_column='Usual_Cleaning_Requirements', max_length=250, blank=True, null=True) # Field name made lowercase.
notes = models.CharField(db_column='Notes', max_length=500, blank=True, null=True) # Field name made lowercase.
feature_image = models.ImageField(upload_to='properties',null=True)
class Meta:
db_table = 'Property'
def __str__(self):
return self.property_reference
def get_absolute_url(self):
return reverse("properties:property_detail",kwargs={'pk':self.pk})
class Bedroom(models.Model):
type = models.CharField(db_column='Type', choices=BEDROOM_TYPE_CHOICES, max_length=50)
bed_dimensions = models.CharField(db_column='Bed_Dimension', choices=BED_DIMENSION_CHOICES, max_length=30)
image = models.ImageField(null=True, blank=True)
ensuite = models.BooleanField(default=False)
notes = models.CharField(db_column='Notes', max_length=500, blank=True, null=True) # Field name made lowercase.
property = models.ForeignKey(Property, null=False, on_delete=models.CASCADE, related_name='bedroom')
我有一个 属性 DetailView Class,它显示了我位于 "property-detail.html" 的模板的所有详细信息。同样在我的模板上,我有一个这样的按钮:
<a class="btn btn-secondary float-right" href="{% url 'properties:add_bedroom' pk=object.pk %}"><i class="fas fa-plus-circle"></i> Add New</a>
此按钮将我带到正确的位置,使用此 link 进入 AddBedroom 表单:
http://127.0.0.1:8000/properties/1/bedrooms/add-bedroom/
我的 urls.py 看起来像这样:
url(r'^(?P<pk>\d+)$',views.PropertyDetailView.as_view(),name='property_detail'),
url(r'^(?P<pk>\d+)/edit$',views.PropertyUpdateView.as_view(),name='property_edit'),
url(r'^(?P<pk>\d+)/bedrooms/add-bedroom/',views.add_bedroom,name='add_bedroom'),
你可以在这里看到我是如何渲染表单的:
#views.py
def add_bedroom(request, pk):
print(pk)
if request.method == 'POST':
form = AddBedroomForm(request.POST, request.FILES)
if form.is_valid():
add_bedroom = form.save()
add_bedroom.instance.property = Property.objects.get(pk = pk)
print('Sucesso')
add_bedroom.save()
return HttpResponseRedirect('/thanks/')
else:
print('Error')
form = AddBedroomForm()
context = {
'add_bedroom_form':form,
'title':"Add Bedroom",
}
return render(request, 'properties/add-bedroom.html', context)
我可以打印 "PK",我也在控制台上得到 POST,但它只是刷新页面,实际上并没有 POSTS 任何东西。我确定我做错了什么,因为我对 Django 还很陌生。
我想出了一个解决方案,我不知道这是否是最佳实践,但它运行良好。
我已将 views.py 更改为:
#views.py
def add_bedroom(request, pk):
get_property_id = pk
data = {'property':get_property_id}
property_reference = Property.objects.get(pk=get_property_id)
print(property_reference)
if request.method == 'POST':
form = AddBedroomForm(request.POST, request.FILES, initial=data)
print(get_property_id)
if form.is_valid():
add_bedroom = form.save()
add_bedroom.save()
return HttpResponseRedirect('/thanks/')
else:
print('Error')
form = AddBedroomForm(initial=data)
context = {
'add_bedroom_form':form,
'title':"Add Bedroom",
'reference':property_reference,
}
return render(request, 'properties/add-bedroom.html', context)
我有两个模型:Properties 和 Bedroom,它们通过 Bedroom 模型上的外键 "Property" 连接。
#models.py
class Property(models.Model):
property_reference = models.CharField(db_column='Property_Reference', max_length=10, unique=True) # Field name made lowercase.
address = models.CharField(db_column='Address', max_length=250, blank=True, null=True) # Field name made lowercase.
post_code = models.CharField(db_column='Post_Code', max_length=15, blank=True, null=True) # Field name made lowercase.
type = models.CharField(db_column='Type', max_length=25, blank=True, null=True, choices=HOUSE_TYPE_CHOICES) # Field name made lowercase.
bedrooms = models.IntegerField(db_column='Bedrooms', blank=True, null=True) # Field name made lowercase.
bathrooms = models.IntegerField(db_column='Bathrooms', blank=True, null=True) # Field name made lowercase.
usual_cleaning_requirements = models.CharField(db_column='Usual_Cleaning_Requirements', max_length=250, blank=True, null=True) # Field name made lowercase.
notes = models.CharField(db_column='Notes', max_length=500, blank=True, null=True) # Field name made lowercase.
feature_image = models.ImageField(upload_to='properties',null=True)
class Meta:
db_table = 'Property'
def __str__(self):
return self.property_reference
def get_absolute_url(self):
return reverse("properties:property_detail",kwargs={'pk':self.pk})
class Bedroom(models.Model):
type = models.CharField(db_column='Type', choices=BEDROOM_TYPE_CHOICES, max_length=50)
bed_dimensions = models.CharField(db_column='Bed_Dimension', choices=BED_DIMENSION_CHOICES, max_length=30)
image = models.ImageField(null=True, blank=True)
ensuite = models.BooleanField(default=False)
notes = models.CharField(db_column='Notes', max_length=500, blank=True, null=True) # Field name made lowercase.
property = models.ForeignKey(Property, null=False, on_delete=models.CASCADE, related_name='bedroom')
我有一个 属性 DetailView Class,它显示了我位于 "property-detail.html" 的模板的所有详细信息。同样在我的模板上,我有一个这样的按钮:
<a class="btn btn-secondary float-right" href="{% url 'properties:add_bedroom' pk=object.pk %}"><i class="fas fa-plus-circle"></i> Add New</a>
此按钮将我带到正确的位置,使用此 link 进入 AddBedroom 表单: http://127.0.0.1:8000/properties/1/bedrooms/add-bedroom/
我的 urls.py 看起来像这样:
url(r'^(?P<pk>\d+)$',views.PropertyDetailView.as_view(),name='property_detail'),
url(r'^(?P<pk>\d+)/edit$',views.PropertyUpdateView.as_view(),name='property_edit'),
url(r'^(?P<pk>\d+)/bedrooms/add-bedroom/',views.add_bedroom,name='add_bedroom'),
你可以在这里看到我是如何渲染表单的:
#views.py
def add_bedroom(request, pk):
print(pk)
if request.method == 'POST':
form = AddBedroomForm(request.POST, request.FILES)
if form.is_valid():
add_bedroom = form.save()
add_bedroom.instance.property = Property.objects.get(pk = pk)
print('Sucesso')
add_bedroom.save()
return HttpResponseRedirect('/thanks/')
else:
print('Error')
form = AddBedroomForm()
context = {
'add_bedroom_form':form,
'title':"Add Bedroom",
}
return render(request, 'properties/add-bedroom.html', context)
我可以打印 "PK",我也在控制台上得到 POST,但它只是刷新页面,实际上并没有 POSTS 任何东西。我确定我做错了什么,因为我对 Django 还很陌生。
我想出了一个解决方案,我不知道这是否是最佳实践,但它运行良好。
我已将 views.py 更改为:
#views.py
def add_bedroom(request, pk):
get_property_id = pk
data = {'property':get_property_id}
property_reference = Property.objects.get(pk=get_property_id)
print(property_reference)
if request.method == 'POST':
form = AddBedroomForm(request.POST, request.FILES, initial=data)
print(get_property_id)
if form.is_valid():
add_bedroom = form.save()
add_bedroom.save()
return HttpResponseRedirect('/thanks/')
else:
print('Error')
form = AddBedroomForm(initial=data)
context = {
'add_bedroom_form':form,
'title':"Add Bedroom",
'reference':property_reference,
}
return render(request, 'properties/add-bedroom.html', context)