Фильтрация Django Вид на Specifi c Экземпляр модели, также написанный тем же пользователем - PullRequest
0 голосов
/ 05 апреля 2020

Это, вероятно, простое решение, но оно ставит меня в тупик. Я новичок в Django и действительно кодирую. Спасибо за ваше терпение.

У меня есть модель профиля, которая является моделью прокси-отношения OnetoOne с абстрактным пользователем. Я использую это для визуализации определенного шаблона c с данными профиля. Это работает просто отлично. Проблема возникает, когда я пытаюсь отобразить данные модели инвентаризации, которые также вводятся тем же пользователем, но перечислены в отдельной модели и приложении. Я получаю весь инвентарь, когда перечисляю его, что неудивительно, поскольку я использую def get_context_data в представлении с

def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['profile'] = Profile.objects.all()
        context['inventory'] = Inventory.objects.all()
        return context

Я знаю, что контекст ['инвентарь'] делает именно то, что нужно Я спрашиваю, но мне нужно, чтобы он фильтровал только объекты, введенные в те же элементы, которые были введены пользователем, который сделал модель профиля ... и я в тупике.

Обе модели ниже:

class Profile(models.Model):
"""Additional User Profile info on a One to One relationship
this tracks all the other info concerning the users and their websites."""

# TODO: Define fields here


# add additional templates under templates/users. Add to the tuples below in this format.
USER_TEMPLATES = (
    ('users/generic/generic.html', ('generic')),
    ('users/clothing/clothing.html',('clothing')) 
)


#model fields

author = models.OneToOneField(CustomUser, on_delete=models.CASCADE, editable = False, null = True)
title = models.CharField(verbose_name = 'Company Name', max_length= 50)
slug = models.SlugField(editable=False,max_length = settings.SLUG_TITLE_MAX_LENGTH)
st_address = models.CharField( max_length=50, verbose_name = 'Street Address')
city = models.CharField(blank = True, max_length = 50, verbose_name = 'City')
state = USStateField(default = 'TN', blank=True)
zipcode = models.CharField(null = True, blank = True, max_length=15)
contact_name = models.CharField(verbose_name = 'Contact Person Name', null = True, blank = True, max_length=50)
contact_email = models.EmailField(verbose_name = 'Contact Person Email', null = True, blank = True, max_length=254)
contact_phone = models.CharField(verbose_name = 'Best Phone Number to Contact', null = True, blank = True, max_length=50, help_text = "Business Phone (XXX) XXX-XXXX")
aboutus = models.TextField(null= True, blank= True, help_text="Write about a paragraph about who you are and the good things your business does.")
greeting = models.TextField(null= True, blank= True, help_text = "Write about a paragraph telling who you are to greet your customers on the front page of your website.")
logo = models.ImageField(null = True, blank = True, upload_to='pic_folder/', height_field=None, width_field=None, max_length=300)
template = models.CharField(choices = USER_TEMPLATES, default = 'users/generic/generic.html', max_length=50)
facebook = models.URLField(blank = True, max_length=200)
instagram = models.URLField(blank = True, max_length=200)
twitter = models.URLField(blank = True, max_length=200)


class Inventory(models.Model):
"""Model definition for Inventory."""

# TODO: Define fields here
author = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name = 'inventory', null = True)
in_stock = models.BooleanField(default = False)
featured = models.BooleanField(default = False)
date_listed = models.DateField( auto_now=True, auto_now_add=False)
main_img = models.ImageField(blank = True, null = True, upload_to='user_inv/', height_field=None, width_field=None, max_length=300)
img1 = models.ImageField(blank = True, null = True, upload_to='user_inv/', height_field=None, width_field=None, max_length=300)
img2 = models.ImageField(blank = True, null = True, upload_to='user_inv/', height_field=None, width_field=None, max_length=300)
img3 = models.ImageField(blank = True, null = True, upload_to='user_inv/', height_field=None, width_field=None, max_length=300)
inv_title = models.CharField(max_length=50)
inv_desc = models.CharField( max_length=250)
long_desc = models.TextField(blank = True, null = True)
price = models.FloatField(max_length = 8, blank = True, null = True, help_text = "Price $9.99")
slug = models.SlugField(default='',editable=False,max_length=settings.SLUG_TITLE_MAX_LENGTH)
sales_link = models.URLField(blank = True, help_text = " online link where you are selling it", max_length=200)
sales_link_title = models.CharField(max_length = 20, blank = True, help_text = "Name of where your link points(Ebay, Etsy, Ect)")

Просмотров: отображение данных профиля идеально, но показывает все данные инвентаризации. Мне нужен способ фильтровать / запрашивать только объекты инвентаризации пользовательских данных профиля, которые правильно перечислены в отображаемом шаблоне.

class CompanyProfile(DetailView):
'''this is the users company page view'''
model = Profile
fields = '__all__'
query_pk_and_slug = True

def form_valid(self, form):
    form.instance.author = self.request.user
    return super().form_valid(form)

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['profile'] = Profile.objects.all()
    context['inventory'] = Inventory.objects.all()
    return context

def get_template_names(self):
    return [self.object.template]

Спасибо и еще раз извините за беспокойство за то, что я уверен, что это действительно легко исправить ...

...