我正在尝试使用Generic Foreign Keys的模型(Prereq)出现在MyModel的管理员中.
models.py:
class MyModel(models.Model):
name = models.CharField(max_length=50, unique=True)
#etc
class Prereq(models.Model):
parent_content_type = models.ForeignKey(ContentType, related_name='prereq_parent')
parent_object_id = models.PositiveIntegerField()
parent_object = GenericForeignKey("parent_content_type", "parent_object_id")
prereq_content_type = models.ForeignKey(ContentType, related_name='prereq_item')
prereq_object_id = models.PositiveIntegerField()
prereq_object = GenericForeignKey("prereq_content_type", "prereq_object_id")
prereq_invert = models.BooleanField(default=False, help_text = 'parent is available if user does NOT have this pre-requisite')
or_prereq_content_type = models.ForeignKey(ContentType, related_name='or_prereq_item', blank=True, null=True)
or_prereq_object_id = models.PositiveIntegerField(blank=True, null=True)
or_prereq_object = GenericForeignKey("or_prereq_content_type", "or_prereq_object_id")
or_prereq_invert = models.BooleanField(default=False, help_text = 'parent is available if user does NOT have this pre-requisite')`
Run Code Online (Sandbox Code Playgroud)
Admin.py: …
在我的Django项目中,我想使用一个只在postgresql中可用的queryset方法,如果正在使用postgresql.
如何从settings.DATABASES检查数据库?
假设这个结构:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # could be: 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'
Run Code Online (Sandbox Code Playgroud)
我的python技能太弱,无法遍历字典结构=(
我有一个简单的形式:
class SubmissionQuickReplyForm(forms.Form):
comment_text = forms.CharField(label='', required=False, widget=forms.Textarea(attrs={'rows':2}))
Run Code Online (Sandbox Code Playgroud)
我想在表单中添加一个form.ChoiceField,其中ChoiceField中的选项是从查询集中填充的.
class SubmissionQuickReplyForm(forms.Form):
comment_text = forms.CharField(label='', required=False, widget=forms.Textarea(attrs={'rows':2}))
choice = forms.ChoiceField(...)
Run Code Online (Sandbox Code Playgroud)
例如,如果我有:
q = MyChoices.Objects.all()
Run Code Online (Sandbox Code Playgroud)
如何用q的内容填充ChoiceField,这样当我在视图中处理表单的结果时,我可以在最后将对象取回?
if request.method == "POST":
form = SubmissionQuickReplyForm(request.POST)
if form.is_valid():
ch = get_object_or_404(MyChoices, pk=?)
# How do I get my object from the choice form field?
Run Code Online (Sandbox Code Playgroud) 我的 Django 站点在 iframe 中使用django-summernote,并抛出此错误:
加载“ http://example.com/summernote/editor/id_comment_text/ ”时遇到多个具有冲突值(“SAMEORIGIN、DENY”)的“X-Frame-Options”标头。回到“拒绝”。
我不知道拒绝来自哪里。
在我的 Django 项目设置中,我有:
MIDDLEWARE_CLASSES = (
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
)
Run Code Online (Sandbox Code Playgroud)
其中:“默认情况下,中间件将为每个传出的 HttpResponse 将 X-Frame-Options 标头设置为 SAMEORIGIN。”
我还在我的 nginx.conf 中添加了这个(来自这里):
add_header X-Frame-Options SAMEORIGIN;
Run Code Online (Sandbox Code Playgroud)
其他可能相关的信息:当我将服务器从 Ubuntu 14.04 升级到 16.04 以及项目的虚拟环境从 Python 3.4 升级到 Python 3.5 时出现了问题。Django 和 django-summernote 的版本还是一样的。
如何找到此拒绝设置的来源?
我的页面加载速度太慢.不知何故,我需要改进查询数据的方式(缓存?部分加载/页面等等)
注意我是一个django noob,并没有完全包裹我的头model.Manager,models.query.QuerySet所以如果这个设置看起来很尴尬....
目前,页面加载查询集大约需要18秒,目前只有大约500条记录.每天平均会有大约100条新记录.
该数据库是Postgresql
慢视图:
def approvals(request):
...
approved_submissions = QuestSubmission.objects.all_approved()
...
Run Code Online (Sandbox Code Playgroud)
慢查询集:
class QuestSubmissionQuerySet(models.query.QuerySet):
...
def approved(self):
return self.filter(is_approved=True)
def completed(self):
return self.filter(is_completed=True).order_by('-time_completed')
...
class QuestSubmissionManager(models.Manager):
def get_queryset(self):
return QuestSubmissionQuerySet(self.model, using=self._db)
def all_approved(self, user=None):
return self.get_queryset().approved().completed()
...
Run Code Online (Sandbox Code Playgroud)
产生的SQL来自QuestSubmission.objects.all_approved():
'SELECT "quest_manager_questsubmission"."id", "quest_manager_questsubmission"."quest_id", "quest_manager_questsubmission"."user_id", "quest_manager_questsubmission"."ordinal", "quest_manager_questsubmission"."is_completed", "quest_manager_questsubmission"."time_completed", "quest_manager_questsubmission"."is_approved", "quest_manager_questsubmission"."time_approved", "quest_manager_questsubmission"."timestamp", "quest_manager_questsubmission"."updated", "quest_manager_questsubmission"."game_lab_transfer" FROM "quest_manager_questsubmission" WHERE ("quest_manager_questsubmission"."is_approved" = True AND "quest_manager_questsubmission"."is_completed" = True) ORDER BY "quest_manager_questsubmission"."time_completed" DESC'
Run Code Online (Sandbox Code Playgroud)
缓慢的模型:
class …Run Code Online (Sandbox Code Playgroud) 下面是一些构建查询集并在每个步骤打印输出的代码(用于调试):
qs = self.get_queryset(True)
print(qs) # [<MyModel: obj_1>, <MyModel: obj_2>, <MyModel: obj_2>, <MyModel: obj_3>]
qs = qs.get_user(user)
print(qs) # []
qs = qs.completed()
print(qs) # []
qs = qs.latest('time_completed')
print(qs) # <-- What happened? Why is this blank?
print(qs is None) # False <-- huh??
print("nothing") if not qs else print("something") # <-- blank?!?! how?!
print(type(qs)) #
Run Code Online (Sandbox Code Playgroud)
最后一个操作qs.latest('time_completed')打印空白,类型为空白,if 语句被忽略。这里发生了什么?
结果不是空查询集的示例工作正常(注意所有项目都是单个用户,只是巧合):
qs = self.get_queryset(True)
print(qs) # [<MyModel: obj_1>, <MyModel: obj_2>, <MyModel: obj_2>, <MyModel: obj_3>]
qs = qs.get_user(user)
print(qs) # …Run Code Online (Sandbox Code Playgroud) 当用户更改密码时,我想发送一个信号,以便我可以在某些型号上做一些事情.
我该如何创建此信号?
我查看post_save了用户的信号:
post_save.connect(user_updated, sender=User)
Run Code Online (Sandbox Code Playgroud)
但是,我似乎没有任何东西可以检查密码是否已更改:
def user_updated(sender, **kwargs):
print(kwargs) # {'created': False, 'raw': False, 'instance': <User: 100002>, 'update_fields': None, 'signal': <django.db.models.signals.ModelSignal object at 0x7ff8862f03c8>, 'using': 'default'}
Run Code Online (Sandbox Code Playgroud)
我也看到有一个password_change_doneauth视图,但我不确定我是如何使用它的.https://docs.djangoproject.com/en/1.10/topics/auth/default/#built-in-auth-views
有任何想法吗?
我正在尝试测试 django 表单视图:
测试.py
form_data = {
'comment_text': "test comment"
}
response = self.client.post(reverse('announcements:comment', args=[self.test_announcement.id]), form_data)
self.assertEqual(response.status_code, 404) # invalid submit button
Run Code Online (Sandbox Code Playgroud)
但我的视图会检查使用哪个按钮来提交表单:
视图.py
def my_view(request, announcement_id):
# ...
if request.method == "POST":
form = CommentForm(request.POST)
if form.is_valid():
# ...
if 'comment_button' in request.POST:
# how do I get inside this branch from a test?
# process form
else:
raise Http404
Run Code Online (Sandbox Code Playgroud)
我如何模仿在测试中用于提交表单的“comment_button”?
我正在运行 uwsgi (在 docker 容器中使用 django),并且生成的每个工作进程都会出现以下错误:
spawned uWSGI master process (pid: 1)
web_1 | spawned uWSGI worker 1 (pid: 18, cores: 2)
web_1 | Exception ignored in: <function _after_at_fork_child_reinit_locks at 0x7fd944954ca0>
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.8/logging/__init__.py", line 260, in _after_at_fork_child_reinit_locks
web_1 | spawned uWSGI worker 2 (pid: 19, cores: 2)
web_1 | _releaseLock() # Acquired by os.register_at_fork(before=.
web_1 | File "/usr/local/lib/python3.8/logging/__init__.py", line 228, in _releaseLock
web_1 | _lock.release()
web_1 | RuntimeError: cannot release un-acquired …Run Code Online (Sandbox Code Playgroud) django ×9
python ×5
choicefield ×1
django-forms ×1
django-tests ×1
django-views ×1
ggplot2 ×1
http-headers ×1
iframe ×1
nginx ×1
performance ×1
postgresql ×1
r ×1
uwsgi ×1
worker ×1