Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 如何编写通用django视图,其中一个ListView或DetailView可用于多个模型_Html_Python 3.x_Django_Python 3.6 - Fatal编程技术网

Html 如何编写通用django视图,其中一个ListView或DetailView可用于多个模型

Html 如何编写通用django视图,其中一个ListView或DetailView可用于多个模型,html,python-3.x,django,python-3.6,Html,Python 3.x,Django,Python 3.6,如何编写可用于许多模型的URL和视图 假设我的模型中有3个模型。py 型号名称:自行车、滑板车、手机 现在,对于通用视图的自行车模型,我们需要: 1]5 views : ListView, DetailView, CreateView, UpdateView, DeleteView 2]5 urls : one for each 5 views we need 1 url 3]4 html files are required : bike_list.html : for ListVi

如何编写可用于许多模型的URL和视图

假设我的模型中有3个模型。py 型号名称:自行车、滑板车、手机

现在,对于通用视图的自行车模型,我们需要:

1]5 views : ListView, DetailView, CreateView, UpdateView, DeleteView
2]5 urls : one for each 5 views we need 1 url
3]4 html files are required : 
    bike_list.html : for ListView
    bike_detail.html : for DetailView
    bike_form.html : for CreateView and UpdateView
    conifirm_delete_view.html : for DeleteView
1]again 5 views : ListView, DetailView, CreateView, UpdateView, DeleteView
2]again 5 urls : one for each 5 views we need 1 url
3]4 html files are required : 
    scooty_list.html : for ListView
    scooty_detail.html : for DetailView
    scooty_form.html : for CreateView and UpdateView
    conifirm_delete_view.html : for DeleteView
现在,对于通用视图的Scooty模型,我们需要:

1]5 views : ListView, DetailView, CreateView, UpdateView, DeleteView
2]5 urls : one for each 5 views we need 1 url
3]4 html files are required : 
    bike_list.html : for ListView
    bike_detail.html : for DetailView
    bike_form.html : for CreateView and UpdateView
    conifirm_delete_view.html : for DeleteView
1]again 5 views : ListView, DetailView, CreateView, UpdateView, DeleteView
2]again 5 urls : one for each 5 views we need 1 url
3]4 html files are required : 
    scooty_list.html : for ListView
    scooty_detail.html : for DetailView
    scooty_form.html : for CreateView and UpdateView
    conifirm_delete_view.html : for DeleteView
对于另一个模型,我需要:5个视图,5个URL,4个html文件

但是,如果您编写通用视图,并在URL中传递模型名称,那么它将在视图中获取该名称,并将其传递给通用视图


因此,相同的5个视图、5个URL和4个html文件可用于许多模型。

GitHub Repo中的完整代码

https://github.com/punisher21maximum/Blog/tree/master/Minimise_Django_Code
url.py

from django.urls import path
from .views import (
    #subcat Views
    SubcatListView,
    SubcatDetailView,
    SubcatCreateView,
    SubcatUpdateView,
    SubcatDeleteView,
)
from . import views

urlpatterns = [
    #subcat
    path('<str:model>/new/', SubcatCreateView.as_view(), name='subcat-create'),
    path('<str:model>/', SubcatListView.as_view(), name='subcat-list'), 
    path('<str:model>/<int:pk>/', SubcatDetailView.as_view(), name='subcat-detail'), 
    path('<str:model>/<int:pk>/update/', SubcatUpdateView.as_view(), name='subcat-update'),
    path('<str:model>/<int:pk>/delete/', SubcatDeleteView.as_view(), name='subcat-delete'),

]
从django.url导入路径
从。视图导入(
#子类别视图
子目录视图,
子元数据视图,
子创建视图,
子组数据视图,
子节点视图,
)
从…起导入视图
URL模式=[
#副歌
路径('/new/',SubcatCreateView.as_view(),name='subcat-create'),
路径(“/”,SubcatListView.as_view(),name='subcat-list'),
路径('/',SubcatDetailView.as_view(),name='subcat-detail'),
路径('//update//',SubcatUpdateView.as_view(),name='subcat-update'),
路径(“//delete/”,SubcatDeleteView.as_view(),name='subcat-delete'),
]
views.py

from django.urls import reverse_lazy
from .models import Post, Bike, Scooty, Bicycle, Mobile
model_dict = {
    "Post":Post, 
    "Bike":Bike, 
    "Scooty":Scooty, 
    "Bicycle":Bicycle, 
    "Mobile":Mobile
    }

#get my fields
def my_get_model_fields(model):
    all_f = [field.name for field in model._meta.get_fields()] 
    rf = ['id', 'date_posted']
    all_f.remove('author')
    for f in all_f: 
        if f in rf or f.endswith('_ptr'):
            all_f.remove(f)
    return all_f

"""subcat view"""
#ListView
class SubcatListView(ListView):

    template_name = 'blog/subcat_list.html'  # <app>/<model>_<viewtype>.html
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 3

    """overriding "dispatch" func to set model passed as arg in URL"""
    def dispatch(self, request, *args, **kwargs):
        self.model = model_dict[ kwargs.get('model', None) ]
        return super(SubcatListView, self).dispatch(request, *args, **kwargs)

    """ "get_queryset" also Required to override model name """
    def get_queryset(self):
        return self.model.objects.filter()

    def get_context_data(self, **kwargs):
        """override "get_context_data" to pass model_name to subcat_list.html"""
        context = super().get_context_data(**kwargs)
        context['class_name'] = self.model._meta.model_name.title() # kwargs.get('model', None) 
        return context

#DetailView
class SubcatDetailView(DetailView):
    """overriding "dispatch" func to set model passed as arg in URL"""

    # template_name = <app>/<model>_<viewtype>.html
    context_object_name = 'post'
    template_name = 'blog/subcat_detail.html'

    def dispatch(self, request, *args, **kwargs):
        self.model = model_dict[ kwargs.get('model', None) ]
        return super(SubcatDetailView, self).dispatch(request, *args, **kwargs)

    def get_queryset(self):
        return self.model.objects.filter()

    def get_context_data(self, **kwargs):
        """override "get_context_data" to pass model_name to subcat_list.html"""
        context = super().get_context_data(**kwargs)
        context['class_name'] = self.model._meta.model_name.title() # kwargs.get('model', None) 
        return context

#CreateView
class SubcatCreateView(LoginRequiredMixin, CreateView):
    # model = Bike
    
    # fields = my_get_model_fields(Bike)
    template_name = 'blog/subcat_form.html'

    def form_valid(self, form):
        """check form author and current logged in user is same"""
        form.instance.author = self.request.user
        return super().form_valid(form)

    def dispatch(self, request, *args, **kwargs):
        """overriding "dispatch" func to set model passed as arg in URL"""
        self.model = model_dict[ kwargs.get('model', None) ]
        return super(SubcatCreateView, self).dispatch(request, *args, **kwargs)

    def get_form_class(self):
        """overriding "get_form_class" func to get fields for model passed in URL"""
        self.fields = my_get_model_fields(model_dict[self.model._meta.model_name.title()])
        return super(SubcatCreateView, self).get_form_class()

#UpdateView
class SubcatUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):

    template_name = 'blog/subcat_form.html'

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

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False

    def dispatch(self, request, *args, **kwargs):
        """overriding "dispatch" func to set model passed as arg in URL"""
        self.model = model_dict[ kwargs.get('model', None) ]
        return super(SubcatUpdateView, self).dispatch(request, *args, **kwargs)

    def get_form_class(self):
        """overriding "get_form_class" func to get fields for model passed in URL"""
        self.fields = my_get_model_fields(model_dict[self.model._meta.model_name.title()])
        return super(SubcatUpdateView, self).get_form_class()

#DeleteView
class SubcatDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):

    template_name = 'blog/post_confirm_delete.html'

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False

    def dispatch(self, request, *args, **kwargs):#model
        """overriding "dispatch" func to set model passed as arg in URL"""
        self.model = model_dict[ kwargs.get('model', None) ]
        return super(SubcatDeleteView, self).dispatch(request, *args, **kwargs)   

    def get_context_data(self, **kwargs):#class_name
        """override "get_context_data" to pass model_name to subcat_list.html"""
        context = super().get_context_data(**kwargs)
        context['class_name'] = self.model._meta.model_name.title() # kwargs.get('model', None) 
        return context

    def get_success_url(self):
        return reverse_lazy('subcat-list', kwargs={'model':self.model._meta.model_name.title()})
从django.url导入反向
从。模型进口邮政,自行车,滑板车,自行车,手机
模型参数={
“岗位”:岗位,
“自行车”:自行车,
“史酷迪”:史酷迪,
“自行车”:自行车,
“移动”:移动
}
#拿到我的田地
定义my_get_model_字段(model):
all_f=[模型中字段的field.name.\u meta.get_fields()]
rf=['id','date_posted']
全部删除(“作者”)
对于所有类型的f:
如果f位于rf或f.endswith(“U ptr”):
全部移除(f)
返回所有
“子目录视图”
#列表视图
类子列表视图(列表视图):
模板名称='blog/subcat_list.html'#
{%if class_name==“Bike”%}
{%include“blog/bike_list2.html”%}
{%elif class_name==“Scooty”%}
{%include“blog/scooty_list2.html”%}
{%elif class_name==“Mobile”%}
{%include“blog/mobile_list2.html”%}
{%endif%}
subcat_detail.html

     {% if object.author == user %}
      <div>
        <!-- update and delete -->
        {% if class_name  == "Bike" %}
        <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'subcat-update' pk=object.id model='Bike' %}">Update</a>
        <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'subcat-delete' pk=object.id model='Bike' %}">Delete</a>
        {% elif class_name  == "Scooty" %}
        <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'subcat-update' pk=object.id model='Scooty' %}">Update</a>
        <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'subcat-delete' pk=object.id model='Scooty' %}">Delete</a>            
        {% elif class_name  == "Mobile" %}
        <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'subcat-update' pk=object.id model='Mobile' %}">Update</a>
        <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'subcat-delete' pk=object.id model='Mobile' %}">Delete</a>            
        {% endif %}
      </div>
    {% endif %}



        
        <div style="font-size: 12px;">
            {% if class_name  == "Bike" %}
                {% include "blog/bike_list2.html" %}
            {% elif class_name  == "Scooty" %}
                {% include "blog/scooty_list2.html" %}
            {% elif class_name  == "Mobile" %}
                {% include "blog/mobile_list2.html" %}
            {% endif %}
        </div>
{%if object.author==user%}
{%if class_name==“Bike”%}
{%elif class_name==“Scooty”%}
{%elif class_name==“Mobile”%}
{%endif%}
{%endif%}
{%if class_name==“Bike”%}
{%include“blog/bike_list2.html”%}
{%elif class_name==“Scooty”%}
{%include“blog/scooty_list2.html”%}
{%elif class_name==“Mobile”%}
{%include“blog/mobile_list2.html”%}
{%endif%}