0

私は2つのモデルを持っています:

class Building(models.Model):
    label = models.CharField(_("Building label"), blank=False, max_length=255)  

    def get_absolute_url(self):
        return reverse('buildings:config', kwargs={'pk': self.id})


class Floor(models.Model):

    label = models.CharField(_("Floor label"), blank=True, max_length=255)

    building = models.ForeignKey(Building, null=False)

ユーザーが建物の情報を変更 (UpdateView) し、同じページに新しいフロア (FloorsConfigForm) を追加できるようにするために、カスタム ModelForm を作成しました。

FloorsConfigForm は次のとおりです。

class FloorsConfigForm(forms.ModelForm):
    class Meta:
        model = Floor
        fields = ["label", "building",]

ビューは次のとおりです。

class BuildingConfigUpdateView(LoginRequiredMixin, UpdateView):
    model = Building
    fields = ('label','address',)
    template_name = "buildings/building_update.html"
    form_floors = FloorsConfigForm(prefix="floor_")

    def get_context_data(self, **kwargs):
        ret = super(BuildingConfigUpdateView, self).get_context_data(**kwargs)
        ret["form_floors"] = self.form_floors
        b = Building.objects.get(id=self.kwargs["pk"])
        ret["floors"] = Floor.objects.filter(building=b)
        return ret

    def post(self, request, *args, **kwargs):
            res = None
            print(request.POST)
            if "action_save" in request.POST:
                res = super(BuildingConfigUpdateView, self).post(request, *args, **kwargs)
            elif "action_add_floor" in request.POST:
                # #add the floor , validate, save...
                self.form_floors = FloorsConfigForm(request.POST, prefix="floor_")
                if self.form_floors.is_valid():
                    self.form_floors.save()
                    res = HttpResponseRedirect(reverse('buildings:config', kwargs={"pk":self.kwargs["pk"]}))
                else:
                    print(self.form_floors.errors)
                    res = HttpResponseRedirect(reverse('buildings:config', kwargs={"pk":self.kwargs["pk"]}))

            else:
                res = HttpResponseRedirect(reverse('buildings:config', kwargs={"pk":self.kwargs["pk"]}))
            return res

これは非常にうまく機能し、私は満足しています(!)

しかし、最後のマイルは、「親」のテンプレートに私の form_floors フォームのエラーを適切に表示することです。

そして、これが私があなたを必要とするところです!

注: 上記のビュー コードでは、フォーム エラー (print(self.form_floors.errors) を出力するだけです。

"<QueryDict: {'csrfmiddlewaretoken': ['gcBxn72bm6cLFXmpIatplZ0cNtsNgMlU'], 'floor_-building': [''], 'action_add_floor': [''], 'floor_-label': ['']}>
<ul class="errorlist"><li>building<ul class="errorlist"><li>This field is required.</li></ul></li></ul>" 

フロアに建物を指定しない場合。

正確な質問は、メイン テンプレートでこのエラー メッセージを表示するにはどうすればよいかということです。

編集 - 近づき ます ビューの投稿定義で、リダイレクトを変更しました。

def post(self, request, *args, **kwargs):
                res = None
                print(request.POST)
                if "action_save" in request.POST:
                    res = super(BuildingConfigUpdateView, self).post(request, *args, **kwargs)
                elif "action_add_floor" in request.POST:
                    # #add the floor , validate, save...
                    self.form_floors = FloorsConfigForm(request.POST, prefix="floor_")
                    if self.form_floors.is_valid():
                        self.form_floors.save()
                        res = HttpResponseRedirect(reverse('buildings:config', kwargs={"pk":self.kwargs["pk"]}))
                    else:
                        print(self.form_floors.errors)
                        res = super(BuildingConfigUpdateView, self).post(request, *args, **kwargs)

                else:
                    res = HttpResponseRedirect(reverse('buildings:config', kwargs={"pk":self.kwargs["pk"]}))
                return res

テンプレート内のエラーにアクセスできます。しかし、私のメインフォームは空です!

私のテンプレートには 2 つの HTML フォームがあるため、空です。したがって、2 番目のフォームを送信すると、POST リクエストには他の kwargs がありません。

ここで、2 つの要求を「融合」する方法を見つける必要があります。

4

0 に答える 0