0

次の(簡略化された)モデルがあります。

class Idea(models.Model):
    tagline = models.TextField()

class Lot(models.Model):
    address = models.CharField()
    ...other fields...
    ideas = models.ManyToManyField(Idea)

ロットに関連するアイデアを含む、ロットに関するすべての情報を一覧表示するロット詳細ページを表示したいと考えています。これは簡単です。

ただし、さらに、ユーザーがこのページからそのロットの新しいアイデアを追加できるようにしたい. 送信後、ユーザーは新しいアイデアがリストに追加されたロット詳細ページに戻る必要があります。

新しいアイデアのインライン フォームセットを試してみましたが、既存のアイデアのドロップダウンとして表示されるだけで、新しいアイデアを作成することはできません。さらに、既に送信されたアイデアを編集/削除するのではなく、ユーザーが新しいアイデアを追加できるようにするだけでよいので、やり過ぎのようです。また、他のロット情報を編集できるようにする必要もありません。関連するアイデアを追加するだけです。

おそらくこれを達成する簡単な方法があることは知っていますが、現時点では少し行き詰まっています。

どんな助けでも大歓迎です。

ありがとう!

編集: Django 管理者について言及しているわけではありません。これは、ユーザー向けフォーム用です。

4

2 に答える 2

0

+外部キー/M2M フィールドの横にクリック可能な緑色のマークがあるはずです。これにより、新しいインスタンスを作成してIdeaからインスタンスに戻ることができLotます。

以下に例を示します ( filter_horizontalforを使用ManyToManyField):

ここに画像の説明を入力

于 2013-08-31T18:56:11.473 に答える
0

ここに私が見つけた解決策があります:(参照: https://docs.djangoproject.com/en/1.5/topics/class-based-views/mixins/#using-formmixin-with-detailview )

class LotDisplay(DetailView):
    model = Lot

    def get_context_data(self, **kwargs):
        context = super(LotDisplay, self).get_context_data(**kwargs)
        context['form'] = IdeaForm()
        return context

class LotAddIdeaView(FormView, SingleObjectMixin):
    model=Lot
    form_class = IdeaForm
    template_name = 'lotxlot/lot_detail.html'

    def post(self, request, *args, **kwargs):
        if not request.user.is_authenticated():
            request.session['post'] = request.POST
            url = "%s?next=%s" % (reverse('account_login'), request.path)
            return HttpResponseRedirect(url)
        else:
            self.object = self.get_object()
            return super(LotAddIdeaView, self).post(request, *args, **kwargs)

    def get_success_url(self):
        return reverse('lotxlot_lot_detail', kwargs={'pk': self.object.pk})

    def form_valid(self, form):
        """
         Auto-populate user
        and save form.
        """
        instance = form.save(commit=False)
        instance.user = self.request.user
        instance.save()
        instance.lots.add(self.object)
        instance.save()

        return HttpResponseRedirect(self.get_success_url())

class LotDetailView(View):
    def get(self, request, *args, **kwargs):
        view = LotDisplay.as_view()
        return view(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        view = LotAddIdeaView.as_view()
        return view(request, *args, **kwargs)
于 2013-09-02T06:50:11.440 に答える