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()