Сохранение внешнего ключа (который не является объектом пользователя) в Django с использованием CreateView - PullRequest
0 голосов
/ 25 мая 2018

TL; DR : я хочу сохранить внешний ключ с помощью класса CreateView - я могу получить группы пользователей для сохранения, но не мои собственные объекты модели.

Context : я пишу Django-приложение, которое работает с группами, сообщениями и пользователями.Записи публикации содержат внешний ключ как для группы, так и для пользователя (запись должна принадлежать группе и пользователю).Я хочу, чтобы пользователь мог добавлять сообщение в группу со страницы самой группы, т. Е. При доступе к форме CreateView для этого нового сообщения не должно быть поля «Группа».

Моя проблема : я хочу сохранить новый объект публикации с классом CreateView с закулисной вставкой группы (из слага) и пользователя (из self.request).user).Обычно для этого я использую метод form_valid (), и он отлично работает для вставки объекта User;однако я не могу понять, почему мой объект группы не будет сохранен.

Некоторая другая информация :

  • Я знаю, что могууспешно захватить объект группы из слизни в кваргах.Я назначил этот объект переменной self.form_group в методе get () и подтвердил, что «тип» объекта является правильным экземпляром класса моей группы.

  • IЯ попытался «получить» объект Group в самом методе form_valid (): все еще не повезло.

  • Я пробовал как закомментированные, так и некомментированные блоки кода в методе form_valid (),соответственно.

Модели :

class Post(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE, related_name = 'posts')
    title = models.CharField(max_length = 100,default = '')
    created_at = models.DateTimeField(auto_now = True)
    post_text = models.TextField()
    post_text_html = models.TextField(editable = False) 
    group = models.ForeignKey(Group, on_delete = models.CASCADE, related_name = 'posts', null = True, blank = True)

-

class Group(models.Model):
     name = models.CharField(max_length = 255, unique = True)
     slug = models.SlugField(allow_unicode = True, unique = True)
     description = models.CharField(max_length = 5000, blank = True, default = '')
     description_html = models.TextField(editable = False, blank = True, default = '')  # Cannot be Edited
     members = models.ManyToManyField(User, through = 'GroupMember')

Views.py

 class CreatePostInGroup(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    model = Post
    fields = ['title', 'post_text']
    template_name = 'posts/post_in_group_form.html'

    def get(self, request, *args, **kwargs):
        print(self.kwargs)
        print(type(self.request.user))
        self.form_group = get_object_or_404(Group, slug=self.kwargs.get('slug'))
        print(type(self.form_group))
        return super(CreatePostInGroup, self).get(request, *args, **kwargs)

    def form_valid(self, form):
        form.instance.user = self.request.user
        try:
            form.instance.group = self.form_group
        except:
            return Http404
        return super(CreatPostInGroup, self).form_valid(form)

    def get_context_data(self, *args, **kwargs):
        context = super(CreatePostInGroup, self).get_context_data(*args, **kwargs)
        context['group'] = Group.objects.get(slug=self.kwargs.get('slug'))
        return context

Спасибо за любую помощь, это сводит меня с ума!

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Оказалось, проблема не в файлах видов или моделей, а в шаблоне.Моя форма отправляла данные в мой обычный «новый пост» CreateView, поэтому мой метод form_valid () никогда не вызывался, а группа никогда не вставлялась.

0 голосов
/ 25 мая 2018

Я думаю, что ваша ошибка пытается вызвать супер метод.По сути, если вы посмотрите на то, что делает form_valid:

def form_valid(self, form):
    """If the form is valid, save the associated model."""
    self.object = form.save()
    return super().form_valid(form)

Другими словами, после сохранения вашего поста с добавленной группой и пользователем, форма снова сохраняется без этого, перезаписывая ваше первое сохранение.Вот что я бы порекомендовал:

self.object = form.save(commit = False)
self.object.group = self.form_group
self.object.user = self.request.user
self.object.save()

А затем используйте return redirect() для перенаправления туда, куда вам нужно идти

...