如何获取detailview内部的主键并用于预填充表单中的隐藏字段?

时间:2019-08-19 16:07:24

标签: django django-models django-forms django-views django-urls

我有两个模型:“属性”和“卧室”,它们通过“卧室”模型上的外键“属性”连接。

 #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')

我有一个Property DetailView类,可在“ 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>

此按钮将我带到正确的位置,带有此链接的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,但是它只是刷新页面,实际上不发布任何内容。我确定我做错了,因为我是Django的新手。

1 个答案:

答案 0 :(得分:0)

我想出了一个解决方案,我不知道这是否是最佳实践,但是效果很好。

我已将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)