簡體   English   中英

Django中具有一對一關系的ModelForm:無法更新

[英]ModelForm in Django with One-to-One relationship: unable to update

我正在使用Django的ModelForm功能創建表單。 但是,我的特定模型通過使用一對一關系的另一個模型進行了擴展。 因此,我創建了兩個單獨的表單,然后由用戶填寫並提交。 創建記錄( 創建場所和餐廳記錄)時,所有這些都可以100%起作用,但是在更新記錄時則無效。 當我嘗試更新表單時,它沒有通過餐廳表單的is_valid檢查。

我是Django新手,還必須說這段代碼中似乎有很多重復之處。 有沒有更好的方法來以更少的重復次數更新/插入記錄?

我的模特:

class Place(models.Model):
    name = models.CharField(max_length=255)

class PlaceForm(ModelForm):
    class Meta:
        model = Place
        fields = ['name']

class Restaurant(models.Model):
    place = models.OneToOneField(
        Place,
        on_delete=models.CASCADE,
        related_name='restaurant',
        primary_key=True,
    )
    location = models.CharField(max_length=255, null=True, blank=True)

class RestaurantForm(ModelForm):
    class Meta:
        model = Restaurant
        exclude = ['place']

這是我的看法:

def create_or_edit(request, id=False):
    restaurantform = False
    if id:
        info = get_object_or_404(Place, pk=id)
        form = PlaceForm(instance=info)
        if hasattr(info, 'restaurant'):
            restaurantform = RestaurantForm(instance=info.restaurant)
    else:
        info = False
        form = PlaceForm()
        if type == 'restaurant':
            restaurantform = RestaurantForm()
    if request.method == 'POST':
        if not id:
            form = PlaceForm(request.POST)
            if type == 'restaurant':
                restaurantform = RestaurantForm(request.POST)
        else:
            form = PlaceForm(request.POST, instance=info)
            if type == 'restaurant':
                restaurantform = RestaurantForm(request.POST, instance=info.restaurant)
        if form.is_valid() and restaurantform.is_valid():
            info = form.save(commit=False)
            info.site = request.site
            info.save()

            if type == 'restaurant':
                if id:
                    restaurantform.save()
                else:
                    restaurant = restaurantform.save(commit=False)
                    restaurant.place = info
                    restaurant.save()

            messages.success(request, 'Information was saved.')
            return redirect(reverse('app:record', args=[info.id]))
        else:
            messages.warning(request, 'Problem saving record')

在您看來,您僅接受創建的發布請求“ request.method =='POST'”。 要更新,請寫

如果request.method =='UPDATE'或'PUT'
在這里寫代碼
.........
.........

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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