簡體   English   中英

如何為django modelform字段設置動態初始值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM