小编Ryu*_*usa的帖子

为什么在Django中使用SlugField()?

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/

有三件事让我采用这种方法

  1. Slug字段没有隐含的唯一性.
  2. get_object_or_404(Blog, pk=id)必须快于get_object_or_404(Blog, slug=slug).
  3. 将slug字段添加到现有模型涉及数据迁移.

那为什么SlugField()?除了动态生成段塞的成本外,上述方法有哪些缺点?

django slug

41
推荐指数
2
解决办法
3万
查看次数

覆盖Django-allauth中的clean_email()方法

我如何覆盖默认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.

python django django-forms django-allauth

3
推荐指数
1
解决办法
1340
查看次数

Celery任务重复问题

我的 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)

python django celery

3
推荐指数
1
解决办法
3893
查看次数

Django admin:在search_fields中使用一对一的关系

我正在尝试使用以下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)

有解决方案吗

django django-admin django-modeladmin

2
推荐指数
1
解决办法
2870
查看次数

QuerySet,在多个字段上使用 annotate()

这是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)
  1. 这里的问题是输出中的投票和喜欢都是相同的。i,e 投票=喜欢=喜欢

  2. 如果我重写视图以仅显示投票或点赞之一,则该页面可以完美运行。

  3. views.py中,如果我使用的话entries = CompetitionEntry.objects.filter(competition__id__exact=comp.id).annotate(vote_count=Count('competitionentryvote')).annotate(likes_count=Count('entrylikes')) ,我会得到与上面1相同的结果

django

2
推荐指数
1
解决办法
1万
查看次数