Django视图按用户向访问者显示对象

Posted

技术标签:

【中文标题】Django视图按用户向访问者显示对象【英文标题】:Django view to display objects by user to visitor 【发布时间】:2017-11-02 03:38:54 【问题描述】:

我创建了一个应用程序,允许注册用户使用表单创建产品。每个注册用户都有一个显示他们的产品的个人资料页面,只有他们在登录时才能看到。我想创建一个视图,允许未注册用户通过单击用户名查看任何用户的产品。我怎么做?

这是产品形式:

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'description', 'url', 'product_type', 'price', 'image', 'image_url']
        labels = 
            'name': 'Product Name',
            'url': 'Product URL',
            'product_type': 'Product Type',
            'description': 'Product Description',
            'image': 'Product Image',
            'image_url': 'Product Image URL',
            'price': 'Product Price'
        
        widgets = 
            'description': Textarea(attrs='rows': 5),
        

产品视图很简单:

    def products(request):
    products = Product.objects.all()
    form = ProductForm()
    return render(request, 'products.html', 'products': products, 'form':form)


def post_product(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = ProductForm(data = request.POST, files = request.FILES)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            product = form.save(commit = False)
            product.user = request.user
            product.likes = 0
            product.save()
        # redirect to a new URL:
        return HttpResponseRedirect('/products')

如果我需要展示其他内容,请告诉我。

【问题讨论】:

【参考方案1】:
class ProductListView(ListView):
    template_name = 'products.html'
    context_object_name = 'product_list'
    paginate_by = None

    def get_queryset(self):
        username = self.request.GET.get('username',None)
        user = None
        if username:
            try:
                user = User.objects.get(username=username)
            except (User.DoesNotExist, User.MultipleObjectsReturned):
                pass
        if user:
            return Product.objects.filter(user=user)
        return Product.objects.none()

urls.py:

url(r'^product/$', ProductListView.as_view(), name='product_list'),

访问页面如www.example.com/product?username=testuser

根据您的编辑:

def products(request):
    username = request.GET.get('username',None)
    user = None
    if username:
        try:
            user = User.objects.get(username=username)
        except (User.DoesNotExist, User.MultipleObjectsReturned):
            pass
    if user:
        return Product.objects.filter(user=user)
    else:
        products = Product.objects.all()
    form = ProductForm()
    return render(request, 'products.html', 'products': products, 'form':form)

【讨论】:

我不得不添加 from django.views.generic.base import ContextMixin from django.views.generic.list import ListView - 现在我得到一个错误 - TypeError: Cannot create a一致的方法解析顺序(MRO ) 用于基础 ContextMixin、ListView 你可以根据你的功能使用我更新的方法。 我做到了 - 我很感激帮助 - 虽然仍然得到 TypeError。我也在研究它。我猜我也需要一个 url 模式。 我已经为产品页面提供了这个:url(r'^products/$', views.products, name = 'products'), - 不确定要添加什么 - 是否可以修复 url 模式类型错误? 我发现错误,将class ProductListView(ContextMixin, ListView): 更改为class ProductListView(ListView):

以上是关于Django视图按用户向访问者显示对象的主要内容,如果未能解决你的问题,请参考以下文章

使用请求对象访问 django 视图中的 html 表单字段

Django 在每个视图中显示消息

Django - 如何访问视图之外的请求对象?

如何向 django-oscar 添加新视图

在 Django 中,只允许管理员用户访问视图

我可以通过 django 视图访问装饰器中的上下文对象吗