Как связать столбец в таблице с определенным пользователем

Я создаю социальный сайт для доставки объектов. Я пытаюсь назначить местоположение пользователю. Если пользователь добавляет местоположение, то местоположение добавляется только пользователю и сохраняется в БД, чтобы в следующий раз, когда он придет добавлять товар, он мог выбрать местоположение, которое он уже добавил.

Проблема, что я не могу назначить местоположение определенному пользователю, добавляется в БД и появляется у всех пользователей.

class Profile(models.Model):
user = models.OneToOneField(User,  related_name="pro", on_delete=models.CASCADE)
profile_pic = models.ImageField(null=True, blank=True, upload_to='img/profile/')
phone = models.CharField("Phone Number", max_length=10 , blank=True)

def __str__(self):
    return str(self.user)

def get_absolute_url(self):
    return reverse('home')

class Location(models.Model):
city = models.CharField(max_length=50, choices=cy.city, blank=True)
street = models.CharField(max_length=100, blank=True)
home_number = models.CharField(max_length=100, blank=True)

def __str__(self):
    return self.city +" "+self.city+" "+ self.street+" "+ self.home_number


class Add_Item(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE, default=None, null=True)
title = models.CharField(max_length=255)
categories  = models.CharField(max_length=255 , choices= all_categories)
description = RichTextField(blank=True,null=True)
condition = models.CharField(max_length=100, choices=cond)
header_image = models.ImageField(null=True, blank=True, upload_to='img/')
more_imges = models.ImageField(null=True, blank=True, upload_to='img/')
Pub_date = models.DateField(auto_now_add=True)
location = models.ForeignKey(Location,  related_name="loc" , on_delete=models.CASCADE  
,blank=True, null=True)

def get_absolute_url(self):
    return reverse('home')

def __str__(self):
    return self.title +" "+self.condition

Вид:

class AddLocationView(CreateView):
model = Location
form_class = AddLocationForm
template_name ='add_location.html'
success_url = reverse_lazy("add-item")

def form_valid(self, form):
    form.instance.location = self.request.user_id
    return super().form_valid(form)

class AddItemView(CreateView):
model = Add_Item
form_class = AddItemForm
template_name ='add_item.html'

В вашем представлении есть строка form.instance.location = self.request.user_id. Эта строка ничего не делает; здесь form.instance является экземпляром Location, но у этого экземпляра нет поля с именем location, поэтому значение просто отбрасывается и НЕ сохраняется вместе с экземпляром.


Если вы хотите показывать пользователю только те места, которые он добавил, то вы можете добавить поле в модель:

class Location(models.Model):
    ...
    added_by = models.ForeignKey(User, ...)
    ...

и измените ваше представление так, чтобы оно сохраняло текущего пользователя (self.request.user) с новым местоположением:

class AddLocationView(CreateView):
    ...
    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.added_by = self.request.user
        self.object.save()

        return redirect(self.get_success_url())

Наконец, вы могли бы модифицировать вашу форму AddItemForm (кода этой формы нет в вопросе), чтобы фильтровать варианты по текущему пользователю запроса.

Вернуться на верх