Django как сохранить значение в модели без присутствия на форме post

У меня есть следующая модель/форма/вид:

Модель

class Account(models.Model):
    username = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    name = models.CharField(max_length=150)
    identifier_type = models.ForeignKey(IdentifierType, on_delete=models.SET_NULL, null=True)
    actflag = models.CharField(max_length=1, blank=True)
    created_date = models.DateTimeField(blank=True, null=True)
    comments = models.TextField(_(
        'comments'), max_length=500, blank=True)
    priority_type = models.ForeignKey(PriorityType, on_delete=models.SET_NULL, null=True)
    deadline_date = models.DateTimeField(blank=True, null=True)


    def __str__(self):
        return self.name

Форма

class PortfolioForm(forms.ModelForm):
    portfolio = forms.CharField(widget=forms.Textarea)

    class Meta:
        model = Account
        fields = ['name', 'comments', 'priority_type', 'deadline_date', 'identifier_type', 'portfolio']

Вид

def portfolios(request):

    if request.user.is_authenticated:

        if request.POST:
            fm = PortfolioForm(request.POST)

            user = User.objects.get(username=request.user)

            if fm.is_valid():
                messages.success(request, 'Portfolio has been created.')                

                fm.save()

                return redirect('portfolios')
        else:
            fm = PortfolioForm()

        context = {"name": request.user, "form": fm}

        return render(request, 'portfolios.html', context)

    else:
        return redirect('login')

Форма прекрасно работает с постингом через мой шаблон, однако вы заметили, что в моей модели есть некоторые поля, которых нет в моей форме, которые я хотел бы заполнить автоматически без необходимости заполнения пользователем - например, поле username я хотел бы, чтобы это был текущий пользователь, который отправляет форму, а также created_date хотел бы, чтобы это была текущая дата, когда пользователь отправил форму.

Я попытался добавить следующее к моему представлению под if fm.is_valid(): попытка сохранить имя пользователя как текущего пользователя в модели, но не сработало:

                Account.objects.username = request.user

Как я могу это сделать? Заранее спасибо

Вы можете сохранить эти значения после создания объекта Account при сохранении формы. Если вы используете параметр commit=False в методе save, это не попадает в базу данных, и вы можете легко модифицировать объект Account.

from django.utils import timezone


def portfolios(request):
    if request.user.is_authenticated:
        if request.POST:
            fm = PortfolioForm(request.POST)
            # user = User.objects.get(username=request.user)

            if fm.is_valid():               
                account = fm.save(commit=False)
                account.username = request.user 
                account.created_date = timezone.now()
                account.save()

                messages.success(request, 'Portfolio has been created.') 
                return redirect('portfolios')
        else:
            fm = PortfolioForm()

        context = {"name": request.user, "form": fm}
        return render(request, 'portfolios.html', context)

    else:
        return redirect('login')

Вы можете использовать django forms instance для сохранения любого предопределенного значения, не показывая и не отображая эти поля вашим пользователям или html шаблону. Вот пример автоматического сохранения полей username и created_date .

if fm.is_valid():               
                fm = fm.save(commit=False)
                fm.instance.user = request.user  
                fm.instance.created_date = timezone.now()
                fm.save()
Вернуться на верх