Как подклассы django generic CreateView с исходными данными?
Я пытаюсь создать диалоговое окно, которое использует функцию jquery.load() для slurp в визуализированной форме django. Функция .load передается pk объекта "alert". Также в функциях класса доступны такие вещи, как self.request.user
, поэтому я могу предварительно заполнить эти поля, показанные ниже в модели Message (models.py):
class Message(models.Model):
user = models.ForeignKey(User)
alert = models.ForeignKey(Alert)
date = models.DateTimeField()
message = models.TextField()
Подкласс django CreateView довольно легко создает контекст с экземпляром 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
, она не захватывает ни один из исходных данных, подобных я ожидал бы. Есть ли специальный трюк, чтобы заставить это работать? Я просмотрел документы (кажется, не хватает примеров на основе представлений классов на основе) и источника, но я не вижу, что мне не хватает.
Ответы
Ответ 1
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
Ответ 2
(Отредактировано, потому что то, что вы пытаетесь, действительно работает)
Я столкнулся с той же проблемой вчера, но теперь она работает – Я думаю, что я возвращал объект вместо dict в get_initial
.
С точки зрения фиксации вашей проблемы, я немного подозрительно отношусь к тому, как вы, кажется, делаете в post()
– вы могли бы попробовать его по умолчанию (без переопределения) post()
?
Вы также можете использовать pdb
(или операторы печати), чтобы проверить значение self.get_form_kwargs
, чтобы установить initial
.
Ответ 3
Вы можете использовать как:
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())
это работа для меня