简体   繁体   中英

How can I create initial values for a model in django?

Everytime a new user is registered I want to create two mail folders: Draft and Deleted, and also allow the user to create his own folders.

How can I override the user registration so the two folders are created for each new user?

Antoher alternative would be to give a default folder value and allow users to add their own new folders.

Models.py

class UserFolder(models.Model):
user          = models.ForeignKey(settings.AUTH_USER_MODEL, null = True, blank = True)


class MessageFolder(models.Model):
folder        = models.ForeignKey(UserFolder, null = True, blank = True)
message       = models.ForeignKey(Message, null = True, blank = True)

You can use django signals to automatically create those by listening in on the signal for the user model.

Below is an example that run a few functions to recalculate stuff when an item is saved/deleted from an order.

from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver

@receiver((post_save, post_delete), sender='main.OrderItem')
def update_order_when_items_changed(sender, instance, **kwargs):
    order = instance.order
    order.set_weight()
    order.set_total_price()
    order.save()

So yours might look something like this (not tested):

@receiver((post_save,), sender='User')
def create_user_folders(sender, instance, created, **kwargs):
   if not created: return
   # generate MessageFolder && UserFolder

One issue I have realized over the years with signals is they are neat to implement however they are synchronous.

Personally I would use subprocess or would suggest using thread to overcome the limitation of making it feel like asynchronous . Or best you can have a cron job which queries the database and creates the folders.

Thanks @electrometro for pointing me in the right direction. This is my final working result:

class UserFolder(models.Model):
user          = models.ForeignKey(settings.AUTH_USER_MODEL, null = True, blank = True)
name          = models.CharField(max_length = 100)

@receiver((post_save), sender=User)
def create_user_folders(sender, instance, created, **kwargs):
    if not created: 
        return
    else:
        # generate MessageFolder && UserFolder
        draft_folder = UserFolder(None,instance.pk,"Draft")
        draft_folder.save()

        deleted_folder = UserFolder(None,instance.pk,"Deleted")
        deleted_folder.save()
        return

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM