【问题标题】:How can I achieve one single form, pre-populated with data from two different Profile instances?如何实现一个表单,预先填充来自两个不同 Profile 实例的数据?
【发布时间】:2018-05-01 01:56:45
【问题描述】:

我有一个模特Pair,还有另一个模特Profile

模型Pair 的一个实例将使用一个从两个不同的Profile 实例中提取的表单。那么,如何使用来自两个配置文件的信息预填充单个表单?

两种型号:Profile & Pair

class Profile(models.Model):
    ...
    favorites = models.CharField(max_length=150)

class Pair(models.Model):
    requester = models.ForeignKey(Profile)
    accepter = models.ForeignKey(Profile)
    requester_favorite = models.CharField(max_length=50)
    accepter_favorite = models.CharField(max_length=50)

目前的形式:

class PairRequestForm(forms.Form):
    your_favorites = forms.CharField(max_length=50)
    partners_favorites = forms.CharField(max_length=50)

代码解释:它的工作方式是,用户(requester) 将请求启动与PairRequestForm 的配对到潜在的accepter
表单应预先填写每个用户的“最爱”。
我不确定如何连接views.py,因为我需要获取两个对象。

class PairRequestView(FormView):
    form_class = PairRequestForm
    template_name = 'profile/pair_request.html'
    success_url = "/"

    def is_valid(self, form):
        return  

注意:必须使用来自Profile 的当前信息预先填充配对表格。但是,表单不会更新任何旧信息(不会更新 save() 任何 Profiles)——它只会创建一个新的 Pair 实例。

【问题讨论】:

  • 如果您不更新/编辑表单,为什么还要它?根据您的请求,您可以通过显示相关信息来执行此操作,基于两个配置文件 ID。
  • @Withnail 它没有更新配置文件。然而,它正在创建一个新的 Pair 对象。您能否更具体一点:“根据两个配置文件 ID 显示相关信息”?
  • 如果我理解正确 - 您想从列表中选择一个接受者。该提议者/接受者组合然后成为 Pair 对象,对吗?您询问 Forms 的原因是因为您想在选择它们时显示每个提议者/接受者对的收藏夹组合吗?
  • 接受者不是从任何列表中选择的——接受者只是恰好在他们的页面上有表单的用户。因此,当提议者在接受者的页面上提交表单时,它们确实会成为一对(在确认后),是的,我想要一个表单,因为该表单还必须显示属于每个用户的收藏夹。
  • 好的,现在和你一起!让我输入一下。

标签: django django-models django-forms django-templates django-views


【解决方案1】:

假设在/profiles/2 之类的地方访问了接受者页面,您可以像往常一样从 url 中捕获接受者的 ID。

几件事 - 您不需要将收藏夹保存到 Pair 模型中,因为对于 Pair 模型的任何使用,您都可以通过执行来访问它们

`p = Pair.objects.get(id=1) #or whatever query
 p.requester.favourites
 > Some of my favourites 
 p.accepter.favourites 
 > Some of your favourites. 

如果您,提议者,id=1,并访问我的,接受者的页面 (id=2),那么您可以填充表单 - (为了清楚起见,我已经做了很长时间)

accepterobj = Profile.objects.get(id=id_from_url_for_page)
proposerobj = Profile.objects.get(id=request.user.id) 

form = PairRequestForm(accepter=accepterobj, 
                       proposer=proposerobj, 
                       accepter_favourites=accepterobj.favourites,                                             
                       proposerobj_favourites=proposerobj.favourites) 

在您的 CBV 中,you can do the queries above by overriding the get_initial 方法在您的 PairRequestView 上。

def get_initial(self):
    """
    Returns the initial data to use for forms on this view.
    """
    initial = super(PairRequestView, self).get_initial()

    initial['proposer'] = self.request.user
    ...etc
    return initial 

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 2020-10-14
    • 2012-05-10
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多