引导模式中的Django Form POST问题

2024-05-14 01:17:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我搜索这个问题已经好几天了。。。不幸的是,我找不到答案

我有一个视图(建筑物),我想添加/编辑具有模态的建筑物。使用当前代码,我可以添加新建筑。但是,由于我无法传递现有建筑的id(pk),因此无法更新它

我有两个视图:一个用于表格,另一个用于表单。我注意到,当我发布时,我的Building视图发布,而不是newBuilding视图

我试图在newBuilding视图中从kwargs获取pk,但在post方法中无法获取

唯一剩下的就是更新

让我分享我的代码

提前谢谢

url.py

path('app/buildings/', login_required(views.Buildings.as_view()), name='buildings'),
path('app/buildings/<int:pk>', login_required(views.NewBuilding.as_view()), name='buildings-pk'),

models.py

class Buildings(TemplateView):
   template_name = 'main_app/buildings.html'
   model = models.Building

    def get_context_data(self, **kwargs):
        context = super(Buildings, self).get_context_data(**kwargs)

        # Get selected site from cache
        active_site = models.Site.objects.filter(id=self.request.session.get('active_site')).get()
        context['active_site'] = active_site

        filtered_buildings = models.Building.objects

        context['buildings'] = filtered_buildings.all()

        return context

    def get_form_kwargs(self):
        kwargs = super(Buildings, self).get_form_kwargs()
        kwargs.update({'active_site': self.request.session.get('active_site'), 'edited_building_id': None})
        return kwargs

    def post(self, request, *args, **kwargs):
        if request.method == 'POST':
            NewBuilding.post(self, request=request, slug=None)
            return HttpResponseRedirect(reverse_lazy('main_app:buildings'))
        else:
            print("error")

class NewBuilding(FormView):
    template_name = 'main_app/new/new_building.html'
    form_class = forms.NewBuildingForm

    active_site = None

    def get_context_data(self, **kwargs):
        context = super(NewBuilding, self).get_context_data(**kwargs)

        # Get selected site from cache
        self.active_site = models.Site.objects.filter(id=self.request.session.get('active_site')).get()
        context['active_site'] = self.active_site
        context['edited_building_id'] = self.kwargs['pk']

        return context

    def get_form_kwargs(self):
        kwargs = super(NewBuilding, self).get_form_kwargs()
        kwargs.update({'active_site': self.request.session.get('active_site'),
                   'edited_building_id': self.kwargs['pk']})
        return kwargs

    def post(self, request, slug=None, *args, **kwargs):
        if request.method == 'POST':

            # HERE, I need to assign the building to be edited.
            # if kwargs['edited_building_id']:
            #     new_building = models.Building.objects.get(id=self.kwargs['edited_building'])
            # else:
               new_building = models.Building()

            new_building.site = models.Site.objects.filter(id=self.request.session.get('active_site')).get()

            if new_building.name != request.POST.get('name'):
                new_building.name = request.POST.get('name')
            if new_building.address != request.POST.get('address'):
                new_building.address = request.POST.get('address')
            new_building.save()

        else:
            print("error")

buildings.html

<div class="portlet box blue">
                    <div class="portlet-title">
                        <div class="tools">
                            <a href="javascript:;" class="collapse">
                            </a>
                        </div>
                    </div>
                    <div class="portlet-body">
                        <div class="table-toolbar">
                            <div class="row">
                                <div class="col-md-12">
                                    <div class="btn-group pull-right">
                                        <button id="sample_editable_1_new" class="btn green" data-target="#full-width" data-toggle="modal" href="{% url "main_app:buildings-pk" pk=0%}">
                                        Add New <i class="fa fa-plus"></i>
                                        </button>
                                    </div>
                                </div>
                            </div>
                        </div>

{#                            modal for new and edited entry#}
                        <div id="full-width" class="modal container fade" tabindex="-1">
                            <div class="modal-header">
                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
                                <h4 class="modal-title">Add Building</h4>
                            </div>
                            <div class="modal-body">
{#                                    modal body#}
                            </div>
                        </div>
                        <table class="table table-striped table-hover table-bordered" id="sample_editable_1">
                        <thead>
                        <tr>
                            <th class="text-center">
                                 Name
                            </th>
                            <th class="text-center">
                                 Address
                            </th>
                            <th class="text-center">
                                 Type
                            </th>
                            <th class="text-center">
                                 Edit
                            </th>
                        </tr>
                        </thead>
                        <tbody>
                        {% for building in buildings %}
                            <tr>
                                <td>
                                    {{ building.name }}
                                </td>
                                <td>
                                     {{ building.address }}
                                </td>
                                <td>
                                     {{ building.type | default_if_none:"-" }}
                                </td>                                    
                                <td>
                                    <a class="edit" data-target="#full-width" data-toggle="modal" href="{% url "main_app:buildings-pk" pk=building.id%}">
                                    Edit </a>
                                </td>
                            </tr>
                        {% endfor %}
                        </tbody>
                        </table>
                    </div>
                </div>

new_building.html

<form class="form-horizontal" method="POST">
{% csrf_token %}
<div class="form-body">
    <div class="form-group last">
        <label class="col-md-3 control-label">Site</label>
        <div class="col-md-4">
            <span class="form-control-static">{{ active_site.name }}</span>
        </div>
    </div>
    <div class="form-group">
        <label class="col-md-3 control-label">Name</label>
        <div class="col-md-4">
            {{ form.name }}
        </div>
    </div>
<div class="modal-footer">
    <button type="submit" class="btn blue">Submit</button>
    <button type="button" class="btn default" data-dismiss="modal">Cancel</button>
</div>
</form>

forms.py

class NewBuildingForm(forms.ModelForm):
    active_site = None
    edited_building_id = 0

class Meta:
    model = models.Building
    fields = ["name", "address", "type", "site", "public_area",
              "electricity_utility_meter", "water_utility_meter", "gas_utility_meter", "hot_water_utility_meter"]

def __init__(self, *args, **kwargs):
    self.active_site = kwargs.pop('active_site')
    self.edited_building_id = kwargs.pop('edited_building_id')
    super(NewBuildingForm, self).__init__(*args, **kwargs)

    edited_building = models.Building.objects.filter(id=self.edited_building_id)

    self.fields['name'] = forms.CharField(
        widget=forms.TextInput(attrs={'placeholder': 'Name', 'class': 'form-control input-circle'}))
    self.fields['address'] = forms.CharField(
        widget=forms.TextInput(attrs={'placeholder': 'Address', 'class': 'form-control input-circle'}),
        required=False)

    if edited_building:
        self.fields['name'].initial = edited_building.get().name
        self.fields['address'].initial = edited_building.get().address

我尝试在FormView上更新kwargs(因为我可以在那里编辑建筑id),但我无法访问POSThttps://imgur.com/G7UcmLo上的kwargs


Tags: nameselfdivformidnewgetrequest