Как подклассифицировать общий CreateView django с начальными данными? - PullRequest
19 голосов
/ 14 апреля 2011

Я пытаюсь создать диалоговое окно, которое использует функцию jload для .load (), чтобы прихлебывать визуализированную форму django. Функция .load передается pk объекта «alert». В функции класса также доступны такие вещи, как self.request.user, поэтому я могу предварительно заполнить эти поля, как показано ниже в модели сообщений (models.py):

class Message(models.Model):

    user = models.ForeignKey(User)
    alert = models.ForeignKey(Alert)
    date = models.DateTimeField()
    message = models.TextField()

Создание подклассов CreateView в django позволяет довольно легко генерировать контекст с экземпляром ModelForm (views.py):

class MessageDialogView(CreateView):
    """ show html form fragment """
    model = Message
    template_name = "message.html"

    def get_initial(self):
        super(MessageDialogView, self).get_initial()
        alert = Alert.objects.get(pk=self.request.POST.get("alert_id"))
        user = self.request.user
        self.initial = {"alert":alert.id, "user":user.id, "message":"test"}
        return self.initial


    def post(self, request, *args, **kwargs):
        super(MessageDialogView, self).post(request, *args, **kwargs)
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        context = self.get_context_data(form=form)
        return self.render_to_response(context)

Проблема в том, что self.initial не отображается с формой. Я заверил, что форма действительно вызывает get_initial и экземпляр формы имеет правильные начальные данные в post, но когда форма отображается в шаблоне message.html, она не захватывает какие-либо исходные данные, как я будет ожидать. Есть ли специальный трюк, чтобы заставить это работать? Я просмотрел документы (кажется, не хватает примеров общих представлений классов) и источника, но не вижу, что мне не хватает.

Ответы [ 3 ]

25 голосов
/ 22 июня 2011

get_initial() должен просто возвращать словарь, а не беспокоиться о настройке self.initial.

Ваш метод должен выглядеть примерно так:

def get_initial(self):
    # Get the initial dictionary from the superclass method
    initial = super(YourView, self).get_initial()
    # Copy the dictionary so we don't accidentally change a mutable dict
    initial = initial.copy()
    initial['user'] = self.request.user.pk
       # etc...
    return initial
0 голосов
/ 28 июня 2019

вы можете использовать как:

from django.shortcuts import HttpResponseRedirect

    class PostCreateView(CreateView):
        model = Post
        fields = ('title', 'slug', 'content', 'category', 'image')
        template_name = "create.html"
        success_url = '/'

        def form_valid(self, form):
            self.object = form.save(commit=False)
            self.object.user = self.request.user
            self.object.save()
            return HttpResponseRedirect(self.get_success_url())

это работа для меня

0 голосов
/ 03 апреля 2012

(отредактировано, потому что то, что вы пытаетесь, действительно работает)

Вчера я столкнулся с той же проблемой, но теперь она работает & ndash; Я думаю, что я возвращал объект вместо dict в get_initial.

С точки зрения решения вашей проблемы, я немного подозрительно отношусь к тому, как много вы делаете в post() & ndash; не могли бы вы попробовать по умолчанию (без переопределения) post()?

Вы также можете использовать pdb (или вывести операторы), чтобы проверить значение self.get_form_kwargs и убедиться, что initial установлено.

...