как проверить и передать экземпляр пользователя в моей форме в Django? - PullRequest
0 голосов
/ 23 марта 2020

Привет. Я пытаюсь создать форму, которая принимает журнал от пользователя, однако я не знаю, как передать экземпляр пользователя. Я привык создавать CreateView для этого, однако, так как я планирую использовать настраиваемые виджеты и настройки, я использую форму модели для создания журналов для пользователя.

Мой вопрос такой же? способ создания представления для проверки экземпляра пользователя?

Это все то же самое, что я сделал с моим createview, а именно:

def form_valid(self,form) :
    form.instance.testuser = self.request.user
    return super().form_valid(form)

Или я должен сделать что-то еще целиком?

Вот мой Forms.py:

from django import forms
from profiles.models import User
from .models import DPRLog


class DateInput (forms.DateInput):
    input_type = 'date'

class Datefield (forms.Form):
    date_field=forms.DateField(widget=DateInput)

class dprform(forms.ModelForm):

    class Meta:
        model = DPRLog
        widgets = {'reportDate':DateInput()}
        fields = ['status','login','logout','reportDate','mainTasks','remarks']

Models.py:

from django.db import models
from profiles.models import User
from django.urls import reverse



# Create your models here.

class Points(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    points = models.IntegerField(default=0, null=False)

    def __str__(self):
        return self.user.username


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.png', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'


class Manager(models.Model):
    manager = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.manager.full_name


class Member(models.Model):
    manager = models.ForeignKey(Manager, on_delete=models.CASCADE)
    member = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=30, null=True)

    def __str__(self):
        return self.member.full_name


class Job(models.Model):
    manager = models.ForeignKey(Manager, on_delete=models.CASCADE)
    member = models.ForeignKey(Member, on_delete=models.CASCADE)
    title = models.CharField(max_length=30, blank=False, null=False)
    description = models.TextField()
    datePosted = models.DateTimeField(auto_now=True)
    file = models.FileField(null=True, blank=True, upload_to='job_files')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('job-detail', kwargs={'pk': self.pk})

class DPRLog(models.Model):
    STATUS_CHOICES = (

        ('PENDING', 'PENDING'),
        ('CANCELLED', 'CANCELLED'),
        ('COMPLETED', 'COMPLETED'),


        )
    TASKS_CHOICES = (
        ('TESTS EXECUTION', 'TESTS EXECUTION'),
        ('TESTS DESIGN', 'TESTS DESIGN'),
        ('MOBILE TESTING WORKSHOP', 'MOBILE TESTING WORKSHOP'),
        ('BENCH ACTIVITY', 'BENCH ACTIVITY'),
        ('DEFECT ANALYSIS','DEFECT ANALYSIS'),
    )




    testuser = models.ForeignKey(User,on_delete = models.CASCADE)
    status = models.CharField(max_length=30, choices=STATUS_CHOICES,null=True)
    reportDate = models.DateField(blank=False, null=False)
    login = models.TimeField(blank=False, null=False)
    logout = models.TimeField(blank=False, null=False)
    mainTasks = models.CharField(max_length=50, blank=False, choices=TASKS_CHOICES, null=True)
    remarks = models.CharField(max_length=30,null=True)

    def __str__(self):
        return f'{self.testuser.full_name} DPR Log'

Views.py:

def dprmodelform(request):
    if request.method=='POST':
        form = dprform(request.POST)
        if form.is_valid():
            form.save()

    form = dprform()
    return render (request,'users/dprform.html',{'form':form})

    def form_valid(self,form) :
        form.instance.testuser = self.request.user
        return super().form_valid(form)


class dprview(LoginRequiredMixin,ListView):
    model = DPRLog
    template_name = 'users/dpr_view.html'
    context_object_name = 'log'

1 Ответ

2 голосов
/ 23 марта 2020

Если вы передадите commit=False в form.save(), вы сможете получить экземпляр из проверенной формы без сохранения в базе данных. Затем вы можете установить атрибут пользователя в экземпляре перед повторным вызовом save

if form.is_valid():
    instance = form.save(commit=False)
    instance.testuser = request.user
    instance.save()
...