简体   繁体   English

交互式下拉列表 django 带有添加新条目的选项

[英]Interactive drop down list django with option to add new entry

I am relatively new to django.我对 django 比较陌生。 I have made a simple app which enable a user to record details regarding a run (Activity).我制作了一个简单的应用程序,使用户能够记录有关运行(活动)的详细信息。 The user enters data such as: distance, time, route name, date ran..etc using a django ModelForm.用户使用 django ModelForm 输入数据,例如:距离、时间、路线名称、运行日期等。

I have a ModelForm which enables the logged on user to add an Activity to the model database.我有一个 ModelForm,它使登录的用户能够将 Activity 添加到 model 数据库。

How do I get the form to add a drop down list of all the routes which are already in the model database AND add a new one if the Person is entering data about a route they haven't ran before.?我如何获得表格以添加 model 数据库中已经存在的所有路线的下拉列表,如果人员正在输入有关他们以前没有运行过的路线的数据,则添加新路线。?

class Person(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    fName = models.CharField(max_length =100)
    lName = models.CharField(max_length =100)
    weight = models.FloatField()
    sex = models.CharField(max_length=10)

    def __str__(self):
        return self.lName

class Activity(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    length = models.FloatField()
    runTime = models.DurationField()
    route = models.CharField(max_length=100)
    ave = models.DurationField()
    dateRun = models.DateField()
    marathon = models.DurationField()

    def __str__(self):
        return self.route ```

I would add model Route in models.py:我会在 models.py 中添加 model Route:

class Person(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    fName = models.CharField(max_length=100)
    lName = models.CharField(max_length=100)
    weight = models.FloatField()
    sex = models.CharField(max_length=10)

    def __str__(self):
        return self.lName


class Route(model.model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    length = models.FloatField()
    route = models.CharField(max_length=100)
    
    
class Activity(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    runTime = models.DurationField()
    route =  models.ForeignKey(Route, on_delete=models.CASCADE)
    ave = models.DurationField()
    dateRun = models.DateField()
    marathon = models.DurationField()

    def __str__(self):
        return self.route

When person wants to add activity he will have all routes that he enters before.当人想要添加活动时,他将拥有他之前输入的所有路线。 That solution require additional job in modelform, and need of another form to add new route.该解决方案需要在模型表单中进行额外的工作,并且需要另一种表单来添加新路线。 I think the ActivityForm should look like:我认为 ActivityForm 应该是这样的:

class ActivityForm(forms.ModelForm):
    class Meta:
        model = Activity
        fields = '__all__'
        widgets = {'person': forms.HiddenInput}

and init it in views.py:并在views.py中初始化它:

form = ActivityForm(initial={'person': request.user.id})
form.field['route'].queryset = Route.objects.filter(person=request.user)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM