Django CBV-将FBV更改为CBV
在写我的第一个真正的django项目时,我意识到我的观点非常巨大。我尝试将其转换为CBV,作为额外的django训练。以下是我的fbv视图:Django CBV-将FBV更改为CBV,django,Django,在写我的第一个真正的django项目时,我意识到我的观点非常巨大。我尝试将其转换为CBV,作为额外的django训练。以下是我的fbv视图: def index(request): context = {} categories = Category.objects.select_related() subcategories = SubCategory.objects.all() context['categories'] = categories co
def index(request):
context = {}
categories = Category.objects.select_related()
subcategories = SubCategory.objects.all()
context['categories'] = categories
context['subcategories'] = subcategories
return render(request, 'mainapp/index.html', context)
def category(request, category_name_slug):
context = {}
try:
category = Category.objects.get(slug=category_name_slug)
subcategory = SubCategory.objects.filter(category=category)
context['subcategories'] = subcategory
context['category'] = category
except Category.DoesNotExist:
raise Http404("Category doesn't exist")
return render(request, 'mainapp/category.html', context)
def subcategory(request, category_name_slug, subcategory_name_slug):
context = {}
form = SiteAddForm(initial={'url': 'http://'})
context['form'] = form
try:
category = Category.objects.get(slug=category_name_slug)
subcategory = SubCategory.objects.filter(category=category
).get(slug=subcategory_name_slug)
sites = Site.objects.filter(subcategory=subcategory, is_active=True)
context['subcategory'] = subcategory
context['category'] = category
context['sites'] = sites
except (SubCategory.DoesNotExist, Category.DoesNotExist):
raise Http404("Nie ma takiej strony")
if request.method == 'POST':
form = SiteAddForm(request.POST)
if form.is_valid():
siteurl = form.cleaned_data['url']
context['siteurl'] = siteurl
try:
page = AddNewSite(siteurl)
except:
print('ERRROR')
context['Error'] = "URL is not responding"
return render(request, 'mainapp/subcategory.html', context)
title = page.title()
description = page.description()
keywords = page.keywords()
if page.check_url_in_database():
context['Error'] = "Site already in database"
return render(request, 'mainapp/subcategory.html', context)
else:
form_extended = SiteAddFormFull(initial={'url': siteurl, 'name':
title, 'description':
description, 'keywords':
keywords})
context['form_extended'] = form_extended
if request.method == 'POST':
form_extended = SiteAddFormFull(request.POST)
if form_extended.is_valid():
keywords = form_extended.cleaned_data['keywords']
name = form_extended.cleaned_data['name']
description = form_extended.cleaned_data['description']
page.add_site(category, subcategory, keywords,
description, name, siteurl)
context['added_site'] = 'Thank you - site was added'
messages.add_message(request, messages.SUCCESS, 'Dodano!!')
return render(request, 'mainapp/subcategory.html', context)
如何使用CBV简单地编写基本视图索引。应该是这样的:
类别:
Sub1
Sub2
类别2:
Sub2a
Sub2b
我应该学习CBV还是继续使用FBV?它能工作吗?以下是我的类别、子类别模型:
class Category(models.Model):
name = models.CharField(max_length=30, unique=True,
verbose_name='Category name')
slug = models.SlugField()
image = models.ImageField(upload_to='category_images',
verbose_name="Category image",
blank=True)
description = models.TextField(default='Description',
verbose_name="Category description")
class Meta:
verbose_name_plural = "Categories"
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Category, self).save(*args, **kwargs)
def image_thumb(self):
if self.image:
return '<img src="/media/%s" width="40" height="40" />' % (self.image)
else:
return('')
image_thumb.short_description = 'Thumb'
image_thumb.allow_tags = True
def __str__(self):
return self.name
class SubCategory(models.Model):
category = models.ForeignKey(
'Category',
related_name='subcategory',
on_delete=models.CASCADE,
blank=True,
null=True,
)
name = models.CharField(max_length=30)
slug = models.SlugField()
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(SubCategory, self).save(*args, **kwargs)
class Meta:
verbose_name_plural = "Subcategories"
def __str__(self):
return self.name
我是CBV的倡导者,当尝试重用代码时,它可以让生活变得更加轻松。还有大量预定义的通用视图,对于大多数实例,这些视图只需稍加调整。对于示例索引,可以使用TemplateView:
class IndexView(TemplateView):
template_name = "mainapp/index.html"
def get_context_data(self, **kwargs):
context = super(IndexView, self).get_context_data(**kwargs)
context['categories'] = Category.objects.select_related()
context['subcategories'] = SubCategory.objects.all()
return context
这更像是要求我们去做无论如何,仅仅为了soNo而将FBV转换成CBV是毫无意义的,事实并非如此。我想得到任何建议,线索,无论什么。。。也许在你看来我的fbv足够好。。。我不知道,我只是在问。也许在你看来。。。非基础DCBV已经有一个标志不是灵丹妙药。如果你的FBV一团糟,你的CBV也会一团糟。如果您想改进代码,请从改进FBV开始。当您认为您的FBV处于良好状态时,如果您希望的话,可以尝试将其重构为CBV。将FBV转换为CBV是一种良好的做法,应该有助于了解CBV方法的细节。