![](/img/trans.png)
[英]How to set initial value from a model's custom field in a ModelForm in Django
[英]How to set dynamic initial values to django modelform field
我對Django有點陌生,我需要為我的modelform字段設置一個動態初始值。 我的模型名稱“作者”中有一個數據庫字段,它有一個外鍵將其連接到django用戶模型。 每當用戶在表單中填寫信息時,我都需要自動將其設置為當前用戶。 從我收集的有關此問題的信息來看,我必須在下面的MyHouseEditForm中定義一個__init__
函數,我是django的新手,並且我看到的所有示例都令人困惑。
forms.py
from django import forms
from django.contrib.auth.models import User
from .models import Myhouses
class MyHouseEditForm(forms.ModelForm):
class Meta:
model = Myhouses
fields = ('author','name_of_accomodation', 'type_of_room', 'house_rent', 'availability', 'location', 'nearest_institution', 'description', 'image')
每當用戶登錄時,我需要為當前用戶設置“作者”的值。
models.py
from django.db import models
from django.contrib.auth.models import User
class Myhouses(models.Model):
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='author')
Available = 'A'
Not_Available = 'NA'
Availability = (
(Available, 'Available'),
(Not_Available, 'Not_Available'),
)
name_of_accomodation = models.CharField(max_length=200)
type_of_room = models.CharField(max_length=200)
house_rent = models.IntegerField(null=True)
availability = models.CharField(max_length=2, choices=Availability, default=Available,)
location = models.CharField(max_length=200)
nearest_institution = models.CharField(max_length=200)
description = models.TextField(blank=True)
image = models.ImageField(upload_to='profile_image')
def __str__(self):
return self.name_of_accomodation
views.py
@login_required
def addlisting(request):
if request.method == 'POST':
form = MyHouseEditForm(request.POST, files=request.FILES)
if form.is_valid():
Houses = form.save(commit=False)
Houses.save()
return redirect('addlisting')
else:
form = MyHouseEditForm()
return render(request, 'houses/addlisting.html', {'form':form })
無需在表單中顯示作者字段。 它會自動使用登錄用戶進行填充。
request.user提供您登錄的用戶對象。 因此,您可以從“表單”字段部分刪除“作者”,然后執行以下操作:
Houses = form.save(commit=False)
Houses.author = request.user
Houses.save()
我在序列化器中做了類似的事情。
我定義了這樣的自定義創建方法:
class MyhousesSerializer(FlexFieldsModelSerializer):
...
def create(self, validated_data):
validated_data['author'] = self.context['request'].user
newhouse = Myhouses.objects.create(**validated_data)
return newhouse
如果使用更常規的模型序列化器也沒關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.