微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

字段无法识别 Django

如何解决字段无法识别 Django

我在我的项目中使用表单集时遇到了问题,我一直在努力找出问题的根源。这样做时,出现了几个不同的错误。一般来说,我想要做的是创建一个实体 A(锻炼)的对象并重定向一个模板/url,让我用实体 B 的对象“填充”它,我将在那时使用模型表单集动态制作.问题似乎围绕着表单,更具体地说:如果我一个一个地写字段,如:

CycleFormSet = modelformset_factory(
    Cycle,fields=('reps','place_in_workout','exercise','number_of_times','break_inbetween'),extra=1
)

然后,当我尝试运行服务器时,出现错误:未知字段(place_in_workout、break_inbetween、reps、number_of_times)。如果我对某个字段使用 exclude 或 do fields = 'all' ,那么此时我不会收到错误消息。但是,当我尝试发布锻炼对象的数据时,出现错误:['ManagementForm 数据丢失或已被篡改']。我的代码

models.py

class Exercise(models.Model):
    name = models.CharField(max_length=150)
    description = models.TextField(max_length=500)

    def __str__(self):
        return self.name


class Workout(models.Model):
    name = models.CharField(max_length=150,null=True)
    created_by_user = models.ForeignKey(User,null=True,on_delete=models.RESTRICT)
    description = models.TextField(max_length=1000,null=True)
    created_at = models.DateTimeField(auto_Now_add=True)

    def __str__(self):
        return self.name


class Cycle(models.Model):
    place_in_workout = models.IntegerField
    exercise = models.ManyToManyField(Exercise)
    number_of_times = models.IntegerField
    reps = models.IntegerField
    break_inbetween = models.IntegerField
    workout = models.ManyToManyField(Workout)


class WorkoutCompleted(models.Model):
    datetime = models.DateTimeField(auto_Now_add=True)
    user = models.ForeignKey(User,on_delete=models.RESTRICT)

forms.py

class createuserForm(UserCreationForm):
    class Meta:
        model = User
        fields = ['username','email','password1','password2']


class WorkoutForm(forms.ModelForm):
    class Meta:
        model = Workout
        fields = ['name','description']


class ExerciseForm(forms.ModelForm):
    class Meta:
        model = Exercise
        fields = ['name','description']


CycleFormSet = modelformset_factory(
    Cycle,fields='__all__',extra=1
)

urls.py

urlpatterns = [
    path('register/',views.register_page,name='register'),path('login/',views.login_page,name='login'),path('logout',views.logout_page,name='logout'),path('',views.index,name='index'),path('browse/',views.browse,name='browse'),path('workouts/<str:user_id>/',views.workouts,name='workouts'),path('add_exercise/',views.add_exercise,name='add_exercise'),path('create_workout/<str:user_id>/',views.fill_workout,name='fill_workout')
]

views.py

@login_required(login_url='login')
def workouts(request,user_id):
    context = {}
    if request.method == 'POST':
        form = WorkoutForm(request.POST)
        if form.is_valid():
            workout = form.save(commit=False)
            workout.created_by_user = request.user
            workout.save()
            workout_id = workout.id
            context = {'workout_id': workout_id}

        return render(request,'Trainmate/fill_workout.html',context)

    else:
        form = WorkoutForm()
        workout_programs = Workout.objects.all()
        user_workouts = workout_programs.filter(created_by_user=user_id)
        context = {'user_workouts': user_workouts,'form': form}
        return render(request,'Trainmate/workouts.html',context)


@login_required(login_url='login')
def fill_workout(request,user_id):
    if request.method == 'POST':
        # workouts = Workout.objects.filter(created_by_user__exact=request.user).order_by('-created_at')
        # current_workout = workouts[0]
        # pk_workout = current_workout.id
        pk_workout = 1
        formset = CycleFormSet(request.POST)
        if formset.is_valid():
            for form in formset:
                cycle = form.save(commit=False)
                cycle.workout = Workout.objects.get(pk=pk_workout)
                cycle.save()
        context = {}
        return render(request,'Trainmate/home.html',context)
    else:
        formset = CycleFormSet(queryset=Cycle.objects.none())
        context = {'formset': formset}
    return render(request,'Trainmate/fill_workout_with_sets',context)

(有更多的观点,我没有包括一些关于登录/注销的观点,如果被问到,我会的,我不想让帖子变得比它已经更大)。另外,我已经运行了带有注释部分的视图,我相信我在查询集上犯了一些错误,因此我给出了 pk_workout=1 以便查询集中的错误不相关。数据库中始终至少有一个锻炼对象。

锻炼.html

{% extends 'Trainmate/main.html' %}

{% block content %}
<h1>My Workouts</h1>

<div>
    {% for workout in user_workouts %}
        <tr>
            <td>{{ workout.name }}</td>
            <td><a class="btn btn-sm btn-info" href="">Update</a></td>
            <td><a class="btn btn-sm btn-info" href="">Delete</a></td><br>
        </tr>
    {% endfor %}
</div>

<h1>Create new Workout</h1>
<form method="POST" action="{% url 'fill_workout' request.user.id %}">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Create Workout">
</form>
{% endblock %}

fill_workout.html

{% extends 'Trainmate/main.html' %}

{% block content %}

<h1>Fill workout with sets</h1>

    <form id="form_container" method="POST" action="">
        {% csrf_token %}
        {{ formset.management_form }}
        {% for form in formset %}
        <div class="set_form">
            {{ form.as_p }}
        </div>
        {% endfor %}
        <button id="add-form" type="button">Add another set</button>
        <button type="submit"> Create Cycle</button>
    </form>

let set_form = document.querySelectorAll(".set_form")
let container = document.querySelector("#form_container")
let add_button = document.querySelector("#add_form")
let total_forms = document.querySelector("#id_form-TOTAL-FORMS")

let form_num = set_form.length -1

add_button.addEventListener('click',add_form)

function add_form(e){
    e.preventDefault()

    let new_form = set_form[0].cloneNode(true)
    let form_regex = RegExp(`form-(\\d){1}-`,'g')

    form_num ++
    new_form.innerHTML = new_form.innerHTML.replace(form_regex,`form-${form_num}-`)
    container.insertBefore(new_form,add_button)

    total_forms.setAttribute('value',`${form_num + 1}`)
}



{% endblock %}

我尝试运行服务器并使用锻炼对象的名称和描述完成表单,而没有上面模板的 javascript 部分,我仍然遇到相同的错误

抱歉,帖子太长了,我一直在尝试在发布之前尽可能地缩小问题的范围,但似乎无处可去。

解决方法

在模型中定义字段时需要初始化字段,() 模型中的模型字段中缺少括号 Cycle

class Cycle(models.Model):
    place_in_workout = models.IntegerField()
    exercise = models.ManyToManyField(Exercise)
    number_of_times = models.IntegerField()
    reps = models.IntegerField()
    break_inbetween = models.IntegerField()
    workout = models.ManyToManyField(Workout)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。