Python 在视图上动态地将子对象与父对象关联

Python 在视图上动态地将子对象与父对象关联,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我有两个模型,Usermodel和Measurements模型。度量模型通过ForeignKey关系与Usermodel相关联。我已经成功地创建了允许创建用户的表单,但是希望在查看这些用户时,您可以从那里创建度量,而不指示关系,因为它应该自动使用当前显示为实例的Usermodel并将其关联。这一直是一个问题。我试着这样写观点 View.py 这不会保存到数据库。我是django的新手,请问我做错了什么 Model.py Form.py 以下是我如何改变你的观点,做你想做的事。注意,模板上下文现在

我有两个模型,Usermodel和Measurements模型。度量模型通过ForeignKey关系与Usermodel相关联。我已经成功地创建了允许创建用户的表单,但是希望在查看这些用户时,您可以从那里创建度量,而不指示关系,因为它应该自动使用当前显示为实例的Usermodel并将其关联。这一直是一个问题。我试着这样写观点

View.py 这不会保存到数据库。我是django的新手,请问我做错了什么

Model.py Form.py
以下是我如何改变你的观点,做你想做的事。注意,模板上下文现在的客户机密钥是user,而不是
measurement

def client_measurements(request, pk):
    client = UserModel.objects.prefetch_related('measurements_set').get(id=pk)
    measurements = client.measurements_set.all()
    if request.method == 'POST':
        form = MeasurementsIForm(request.POST, request.FILES)

        if form.is_valid():
            measurement = form.save(commit=False)
            measurement.client_name = client
            measurement.save()
            return HttpResponseRedirect(reverse_lazy('client', args=   [measurement.id]))
    else:
        form = MeasurementsIForm()
    return render(request, 'app/measurements.html', {'form':form,      'measurements': measurements, 'client': client})
另外,我强烈建议将您的测量模型更改为:

class Measurement(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    client = models.ForeignKey(UserModel, on_delete=models.CASCADE)

应命名ForeignKey属性,以便表示相关模型实例,而不是它们的属性。当使用ORM时,你应该利用抽象,而不是对抗抽象。

只是再次检查了这段代码,使用前面的答案,我成功地让它工作。我不知道为什么它以前不起作用,因为我最初就是这样做的

新观点
如果有更好的解决办法,我很想知道。谢谢。

请包括您的模型和
measurementsform
。class-measurementsform(forms.ModelForm):class-Meta:model=measures字段='all'排除=['user\u name','client\u name']。由于某些原因,我无法让表单代码像初始代码一样显示。请原谅,请在问题中加入您的模型。我已经用您可能需要的所有必要信息更新了问题。谢谢你的回复。。我试过了,但又犯了一个错误。“UserModel匹配查询不存在。”
class ClientForm(forms.ModelForm):
client_name = forms.RegexField(regex=re.compile(r'[A-Z][a-z]+((\s[A-Z]([a-z]+)?)?)((\s[A-Z]([a-z]+)?)?)'), required=True, error_messages={'invalid': "Each name must be Capitalized. E.g 'Kelly Roland' not 'kelly roland'"}, label="Client's Full Name")
tel = forms.RegexField(regex=re.compile(r'(080|090|070|081)[0-9]{8}'), required=False, error_messages={'invalid': "Enter a valid phone number"}, label="Phone No")
class Meta:
    model = UserModel
    widgets = {
        "tel": TextInput(),
        "client_name": TextInput(attrs={"placeholder": "Emanuel Felix Johnson"})
    }
    labels = {
        "client_name": "Client's FullName",
        "tel": "Phone No",
        "client_gender": "Gender"
    }

    fields = ('client_name', 'client_gender', 'address', 'tel', 'image' )

class MeasurementsIForm(forms.ModelForm):
class Meta:
    model = Measurements
    fields = '__all__'
    exclude = ['user_name', 'client_name']
def client_measurements(request, pk):
    client = UserModel.objects.prefetch_related('measurements_set').get(id=pk)
    measurements = client.measurements_set.all()
    if request.method == 'POST':
        form = MeasurementsIForm(request.POST, request.FILES)

        if form.is_valid():
            measurement = form.save(commit=False)
            measurement.client_name = client
            measurement.save()
            return HttpResponseRedirect(reverse_lazy('client', args=   [measurement.id]))
    else:
        form = MeasurementsIForm()
    return render(request, 'app/measurements.html', {'form':form,      'measurements': measurements, 'client': client})
class Measurement(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    client = models.ForeignKey(UserModel, on_delete=models.CASCADE)
@login_required
def client_measurements(request, pk):
    client = UserModel.objects.get(id=pk)
    measurements = client.measurements_set.all()
    if request.method == 'POST':
        form = MeasurementsUpdateForm(request.POST, request.FILES)
        if form.is_valid():

            measurement = form.save(commit=False)
            measurement.user_name = request.user
            measurement.client_name = client
            measurement.save()

        return HttpResponseRedirect(reverse_lazy('client', args=   [client.id]))
else:
    form = MeasurementsUpdateForm()
return render(request, 'app/measurements.html', {'form':form, 'measurements': measurements, 'client': client})