Я хочу добавить поля 'created_by' и 'modified_by' в мои модели Django, Как мне это сделать?

Моя пользовательская модель пользователя в account.models.py:

class MyRegistration(AbstractBaseUser, PermissionsMixin):
    location_list=[
        ('abc', 'abc'),
        ('def', 'def'),
        ]
    username=models.CharField(max_length=10, unique=True)
    email=models.EmailField(unique=True)
    first_name=models.CharField(max_length=150)
    last_name=models.CharField(max_length=150)
    location=models.CharField(max_length=10, choices=location_list, default=None)
    designation=models.CharField(max_length=70)
    is_active=models.BooleanField()
    is_staff=models.BooleanField(default=False)
    start_date=models.DateTimeField(default=timezone.now)
    last_login=models.DateTimeField(null=True)


    USERNAME_FIELD='username'
    REQUIRED_FIELDS=['email', 'first_name', 'last_name', 'location', 'designation']
    objects=FirstManager()
    def __str__(self):
        return self.username

Модель в sample.models.py:

class LockData(models.Model):
    patient=models.ForeignKey(Patient, on_delete=CASCADE, default=None)
    patient_type=models.ForeignKey(PatientType, on_delete=CASCADE, default=None, blank=True, null=True)
    lock=models.BooleanField(default=False)
    date=models.DateField(default=datetime.date.today)
    created_on=models.DateTimeField(auto_now_add=True)
    modified_on=models.DateTimeField(auto_now=True)

Итак, наряду с полями created_on и modified_on мне также нужны поля 'created_by' и 'modified_by'. Как я могу это сделать?

Начнем с функциональных представлений. Предположим, что у вас есть форма, которая была передана в представление для создания новой модели:

def create_lock_data(request):
    if request.method == "POST":
        form = lock_data_create_form(request.POST)
        if form.is_valid():
            form.instance.created_by = request.user
            form.instance.modified_by = request.user
            form.save()
    else:
        form=lock_data_create_form()
     #...render template etc

Подобным образом, в представлении редактирования

def edit_lock_data(request, lock_id):
    lock = get_object_or_404(LockData, pk = lock_id)
    if request.method == "POST":
        form = data_lock_edit_form(request.POST, instance=lock)
        if form.is_valid():
            form.instance.modified_by = request.user
            form.save()
    else:
        form=lock_data_edit_form()
    #...render template etc

Если вы используете представления на основе классов, вам просто нужно поместить содержимое условной формы form.is_valid() в функцию form_valid(), не забывая при этом использовать self при обращении к запросу, например,

def form_valid(self, form):
    form.instance.created_by = self.request.user #only use for create
    form.instance.modified_by = self.request.user
    return super().form_valid(form)
Вернуться на верх