簡體   English   中英

Flask - 使用 populate_obj 后保存額外的字段

[英]Flask - saving extra field after using populate_obj

我有一個小型 Flask 應用程序,它使用 populate.obj 方法將表單數據保存到對象。

模型.py:

class User(db.DynamicDocument):
    username = db.StringField(unique=True)
    email = db.StringField(unique=True)
    role = db.IntField(default=ROLE_USER)

class Post(db.DynamicDocument):
    created_at = db.DateTimeField(default=datetime.datetime.now, required=True)
    title = db.StringField(max_length=255, required=True)
    slug = db.StringField(max_length=255, required=True)
    comments = db.ListField(db.EmbeddedDocumentField('Comment'))
    author = db.ReferenceField(User)

## various subclasses of BlogPost
...

視圖.py:

class Detail(MethodView):

decorators = [login_required]

# Map post types to models
class_map = {
    'post': BlogPost,
    'video': Video,
    'image': Image,
    'quote': Quote,
}

def get_context(self, slug=None):

    if slug:
        post = Post.objects.get_or_404(slug=slug)
        # Handle old posts types as well
        cls = post.__class__ if post.__class__ != Post else BlogPost
        form_cls = model_form(cls, exclude=('created_at', 'comments', 'author'))
        if request.method == 'POST':
            form = form_cls(request.form, inital=post._data)
        else:
            form = form_cls(obj=post)
    else:
        # Determine which post type we need
        cls = self.class_map.get(request.args.get('type', 'post'))
        post = cls()
        form_cls = model_form(cls, exclude=('created_at', 'comments', 'author'))
        form = form_cls(request.form)
    context = {
        "post": post,
        "form": form,
        "create": slug is None
    }
    return context

    if form.validate():
        post = context.get('post')
        form.populate_obj(post)
        post.save()

這工作正常。 但我想做的也是保存用戶對象:

...
if form.validate():
    post = context.get('post')
    form.populate_obj(post)
    post(author=MyUserObject)  # this fails!
    post.save()

這失敗並出現錯誤:

TypeError: 'BlogPost' object is not callable

我有興趣了解為什么會這樣,以及我應該如何保存我的用戶對象? 我可能在這里展示了我對populate_obj方法的無知。

所以,答案似乎是語法。 這有效:

  if form.validate():
        post = context.get('post')
        form.populate_obj(post)
        post.author = g.user
        post.save()

做這個:

if request.POST and form.validate():
    form.populate_obj(post)
    post.save()

暫無
暫無

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

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