Django models.SlugField()有助于我们创建一些很酷的网址.我的问题是为什么将它指定为一个字段
假设我有这个模型
class Blog(models.Model):
title = models.CharField()
Run Code Online (Sandbox Code Playgroud)
如果我想添加slug,我可以使用
class Blog(models.Model):
title = models.CharField()
def title_slug(self):
return slugify(self.title)
Run Code Online (Sandbox Code Playgroud)
在我可以使用的网址中
(r'^blog/(?P<id>\d+)/(?P<slug>[-\w]+)/$', 'app.views.blog_view'),
Run Code Online (Sandbox Code Playgroud)
并在意见中
def blog_view(request, id ,slug):
get_object_or_404(Blog, pk=id)
...
Run Code Online (Sandbox Code Playgroud)
网址看起来像
example.com/blog/23/why-iam-here/
有三件事让我采用这种方法
get_object_or_404(Blog, pk=id)必须快于get_object_or_404(Blog, slug=slug).那为什么SlugField()?除了动态生成段塞的成本外,上述方法有哪些缺点?
我如何覆盖默认clean_email()方法allauth.account.forms.BaseSignupForm.我在Forms.py中尝试了以下内容:
from allauth.account.forms import BaseSignupForm
class Extended_BaseSignupForm(BaseSignupForm):
def clean_email(self):
data = self.cleaned_data['email']
if "@gmail.com" not in data: # any check you need
raise forms.ValidationError("Must be a gmail address")
if app_settings.UNIQUE_EMAIL:
if data and email_address_exists(data):
raise forms.ValidationError \
(_("A user is registered with this e-mail address."))
return data
Run Code Online (Sandbox Code Playgroud)
覆盖的目的是防止用户注册一次性电子邮件ID.
我的 VPS 上运行着 3 个 celerybeat 实例(使用不同的 settings.py)。其中三个实例由具有相同代码的三个网站使用。该任务基本上向数百个注册用户发送电子邮件(使用 sendgrid)。
我的问题是,当使用 ETA 方法运行时,我的任务运行了 3 次,如下所示。
sdate = datetime.datetime.strptime(request.POST['schedule_date'],'%d-%m-%Y %H:%M')
tz=get_current_timezone()
celery_scheduled_campaign.apply_async(eta=tz.localize(sdate),
kwargs={'schedule_id': schedule.id })
Run Code Online (Sandbox Code Playgroud)
但在使用.delay方法时按预期运行(仅一次)。
celery_sendmail_task.delay(pro_campaign,unsubscribe_url,ecm_host)
Run Code Online (Sandbox Code Playgroud)
设置_one.py
...
BROKER_URL = 'redis://localhost:6379/0'
...
Run Code Online (Sandbox Code Playgroud)
设置_two.py
...
BROKER_URL = 'redis://localhost:6379/1'
...
Run Code Online (Sandbox Code Playgroud)
设置_三.py
...
BROKER_URL = 'redis://localhost:6379/2'
...
Run Code Online (Sandbox Code Playgroud)
任务.py
from celery import task
from bulkmailer import send_email
from models import CampaignSchedule, SendgridEmailQuota
import logging
logger = logging.getLogger("ecm_console")
#import pdb
#import time
#from django.core.mail import EmailMultiAlternatives
@task.task(ignore_result=True)
def celery_sendmail_task(obj,unsubscribe_url,host):
#time.sleep(10)
send_email(obj,unsubscribe_url,host)
obj.status=True
if obj.campaign_opt=='S':
obj.campaign_opt='R' …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下Model和ModelAdmin类将搜索添加到我的模型管理列表页面:
models.py
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
country = CountryField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
admin.py
from django.contrib import admin
from models import UserProfile
class UserProfileAdmin(admin.ModelAdmin):
list_display = ('user','country')
search_fields = ['user']
Run Code Online (Sandbox Code Playgroud)
但是在尝试访问管理面板中的UserProfile时出现以下错误:
at /admin/profiles/userprofile/ Related Field has invalid
lookup: icontains
Run Code Online (Sandbox Code Playgroud)
我也尝试过以下方法:
search_fields = ['user_username']
Run Code Online (Sandbox Code Playgroud)
和
search_fields = ['user_name']
def user_name(self,obj):
return obj.user.username
Run Code Online (Sandbox Code Playgroud)
有解决方案吗
这是models.py
class CompetitionEntry(models.Model):
submitter = models.ForeignKey(User)
pic = models.ImageField(upload_to=images, blank=True, null=True)
class CompetitionEntryVote(models.Model):
voted_entry = models.ForeignKey(CompetitionEntry)
class Entrylikes(models.Model):
ip_address = models.IPAddressField()
liked_entry = models.ForeignKey(CompetitionEntry)
Run Code Online (Sandbox Code Playgroud)
这是views.py(我认为问题就在这里)
def show_all_entries(request, id):
entries = CompetitionEntry.objects.filter(competition__id__exact=comp.id).annotate(vote_count=Count('competitionentryvote'), likes_count=Count('entrylikes'))
return render(request, "show_all.html", {
"entries": entries,
})
Run Code Online (Sandbox Code Playgroud)
显示全部.html
{% for item in entries %}
Votes = {{item.vote_count}} Likes= {{item.likes_count}}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
这里的问题是输出中的投票和喜欢都是相同的。i,e 投票=喜欢=喜欢
如果我重写视图以仅显示投票或点赞之一,则该页面可以完美运行。
在views.py中,如果我使用的话entries = CompetitionEntry.objects.filter(competition__id__exact=comp.id).annotate(vote_count=Count('competitionentryvote')).annotate(likes_count=Count('entrylikes')) ,我会得到与上面1相同的结果