Связывание объектов и пользователей в Django с использованием общих представлений - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь связать коллекцию объектов с зарегистрированным пользователем.

Urls.py

urlpatterns = [
path('new/collection', views.CollectionCreate.as_view(), name="create"),
path('edit/collection/<int:pk>', views.CollectionUpdate.as_view(), name='update'),
path('delete/collection/<int:pk>', views.CollectionDelete.as_view(), name='delete'),
]

Views.py

На этой странице создается форма, в которой зарегистрированный пользователь User вводит заголовок Collection и создает его.Как сейчас, Collection не ассоциируется ни с одним пользователем.Я знаю, что в этой точке мне нужно прикрепить созданный Collection к зарегистрированному User, но я достиг точки остановки.

class CollectionCreate(CreateView):
    model = Collection
    template_name = 'upload/collection_form.html'
    fields = [
        'title'
    ]

Models.py

В этом классе коллекция ассоциируется с пользователем Django по умолчанию.

class Collection(models.Model):
    user = models.OneToOneField(User, blank=True, null=True, on_delete=models.CASCADE)
    title = models.CharField(max_length=140)
    tags = models.CharField(max_length=140)
    upload_date = models.DateTimeField(auto_now_add=True)

    def get_absolute_url(self):
        return reverse('gallery:detail', kwargs={'pk': self.pk})

    def __str__(self):
        return self.title + ' by ' + self.author

    class Meta:
        ordering = ['-upload_date']

Учитывая form.ModelForm, я знаю, что могу получить доступ к переданным данным, используя form = ModelForm(request.POST)внутри def post(self, ...) функции.

Я не знаю, как это сделать в CreateView.

1 Ответ

0 голосов
/ 22 октября 2018

Похоже, вам следует настроить метод get_form_kwargs.get_form_kwargs получает все аргументы, предоставленные в форме, и один из способов решения вашей проблемы - ввести текущего пользователя в данные, предоставленные в форме:

def get_form_kwargs(self):
    """
    Returns the keyword arguments for instantiating the form.
    """
    kwargs = {
        'initial': self.get_initial(),
        'prefix': self.get_prefix(),
    }

    # Add user to form kwargs
    data = self.request.POST.copy()
    data['user'] = self.request.user

    if self.request.method in ('POST', 'PUT'):
        kwargs.update({
            'data': data,
            'files': self.request.FILES,
        })
    return kwargs
...