Прежде всего, я бы настроил следующее для обработки обнаружения и создания ссылки:
- Создайте ModelForm для получения отправленного пользователем
Task
.Создайте пользовательский валидатор для работы с полем description
этой формы.Этот валидатор проверит, что любые ссылки, введенные пользователем, соответствуют указанному вами формату [[:]]. - Переопределить метод сохранения на модели
Task
.Это хорошее время, чтобы проверить содержание описания и создать соответствующие ссылки.
Теперь в методе сохранения происходит реальное действие.Я бы использовал регулярные выражения, чтобы вытащить все ссылки, а затем работать через них одну за другой.
- Для каждой ссылки необходимо определить модель, с которой связан.Это было бы легко с помощью словаря моделей с указанием их имен.
- Необходимо определить, действительно ли ссылка идентифицировала действительный экземпляр модели.Если нет, либо пропустите эту ссылку, либо создайте исключение и удалите его из всего процесса (см. Выше относительно транзакций).
- Вам необходимо создать ссылки.Увидеть ниже.
В Django есть стандартный механизм для общих внешних ключей , который вы обязательно должны использовать здесь.Вы можете создать класс ссылок что-то вроде:
class Link(models.Model):
# link to particular task:
task = models.ForeignKey(Task)
# these three fields together set up a generic foreign key which
# represents the object you're linking to:
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
Ваши объекты модели Task будут автоматически получать атрибут с именем link_set
, который будет списком экземпляров Link.
Создание ссылки будет выглядеть примерно так:
# encountered a description with [[User:43]]
instance = User.objects.get(pk=43)
link = Link.objects.create(task=my_task_object, content_object=instance)
Если присвоить атрибуту Link content_object
экземпляр другой модели, его поля content_type
и object_id
автоматически заполняются длявы, и ваша ссылка будет преобразована обратно в указанный экземпляр.
Надеюсь, что это полезно.Запросите более подробную информацию, если вам это нужно.