激活一个来自模型的信号来创建一个目录文件夹



希望一切安好。我希望你能给我点建议。每次在App模块中创建板时,我都试图创建一个文件夹。文件将通过其他方式上传。然而,我需要一个文件夹目的地与董事会名称创建在董事会保存。我试图调用信号文件作为一个常规函数,但最终出现了无数的错误。如果我在django外部调用信号函数,效果会很好。

我希望每次用户保存一个Board时,一个文件夹被添加到User_Files"目录中。我知道node.js会做这项工作。只是还没到那一步。

我可以连接一个信号从模型到信号,但得到一个

"python manage.py runserver
Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/threading.py", line 926, in _bootstrap_inner
self.run()
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper
fn(*args, **kwargs)
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 110, in inner_run
autoreload.raise_last_exception()
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/site-packages/django/utils/autoreload.py", line 76, in raise_last_exception
raise _exception[1]
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/site-packages/django/core/management/__init__.py", line 357, in execute
autoreload.check_errors(django.setup)()
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper
fn(*args, **kwargs)
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/site-packages/django/apps/registry.py", line 114, in populate
app_config.import_models()
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/site-packages/django/apps/config.py", line 211, in import_models
self.models_module = import_module(models_module_name)
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/Users/zeitgeist/Desktop/Gear/Thelium Backups/JUPYTER_THELIUM/thelium/env/thelium/boards/models.py", line 70, in <module>
signals.post_save.connect(mkdir_board(Board, sender=Board))
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/site-packages/django/db/models/signals.py", line 28, in connect
weak=weak, dispatch_uid=dispatch_uid,
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/site-packages/django/db/models/signals.py", line 23, in _lazy_method
return partial_method(sender)
File "/Users/zeitgeist/opt/anaconda3/lib/python3.7/site-packages/django/dispatch/dispatcher.py", line 90, in connect
assert callable(receiver), "Signal receivers must be callable."
AssertionError: Signal receivers must be callable.

我似乎一辈子也想不出一个解决办法。请帮助我倒在互联网上几天试图弄清楚这一点。有人能看到我的代码的问题吗?提前感谢大家!

这是我的models.py

from django.contrib.auth import get_user_model
from django.db import models
from model_utils.models import TimeStampedModel
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from pathlib import Path
import errno
import os
from django.db.models import signals
from django.dispatch import Signal
from .signals import mkdir_board
User = get_user_model()
class Board(models.Model):
name = models.CharField(max_length=50)
owner = models.ForeignKey(
User, on_delete=models.PROTECT, related_name="owned_boards"
)
members = models.ManyToManyField(User, related_name="boards")


class Meta:
ordering = ["id"]
def __str__(self):
return self.name

def save(
self, force_insert=False, force_update=False, using=None, update_fields=None
):
is_new = self.pk is None
super().save(force_insert, force_update, using, update_fields)
if is_new:
self.members.add(self.owner)
def send_signal(self):
signals.send_robust(sender=self.__class__, instance=self)

signals.post_save.connect(mkdir_board(Board, sender=Board))
class Label(models.Model):
name = models.CharField(max_length=255)
color = models.CharField(max_length=7)
board = models.ForeignKey("Board", related_name="labels", on_delete=models.CASCADE)
def __str__(self):
return self.name
class Meta:
constraints = [
models.UniqueConstraint(fields=["name", "board"], name="unique_name_board")
]

serializers.py

from django.contrib.auth import get_user_model
from django.db import IntegrityError
from rest_framework import serializers
from rest_framework.validators import ValidationError
from accounts.serializers import BoardMemberSerializer
from .models import Board, Task, Column, Label, Comment
from pathlib import Path
import errno
import os
User = get_user_model()

class BoardModelSerializer(serializers.ModelSerializer):
def create(self, validated_data):
if self.context["request"].user not in validated_data["board"].members.all():
raise serializers.ValidationError("Must be a member of the board!")
return super().create(validated_data)

class BoardSerializer(serializers.ModelSerializer):
owner = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = Board
fields = ["id", "name", "owner"]

signals.py

from django.contrib.auth.models import User
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiverimport Board 
import errno
import os

from django.contrib.auth import get_user_model
User = get_user_model()
path = "boards/User_Files/"
@receiver(post_save)
def mkdir_board(self, sender, **kwargs):

try:
os.makedirs(path)
except OSError as exc:  # Python ≥ 2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
# possibly handle other errno cases here, otherwise finally:
else:
raise

admin.py

from adminsortable.admin import SortableAdmin
from django.contrib import admin
from .models import Board, Label

class LabelAdmin(admin.ModelAdmin):
list_display = ["name", "board"]
list_filter = ["board"]
search_fields = ["name"]
class Meta:
model = Label

admin.site.register(Label, LabelAdmin)
admin.site.register(Board)

apps.py

from django.apps import AppConfig
class BoardsConfig(AppConfig):
name = "boards"
def ready(self):
""" Executes whatever is necessary when the application is ready. """
from . import signals 

别介意!想通了!

@receiver(post_save, sender = Board) 
def mkdir_board(sender, instance ,**kwargs):
rel_path = "boards/User_Files/_{}".format(instance.id)
try:
os.makedirs(rel_path)
except OSError as exc:  # Python ≥ 2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
# possibly handle other errno cases here, otherwise finally:
else:
raise

现在工作像一个魅力!希望这能帮助到一些人

最新更新