一种形式的多个实例

时间:2017-04-21 03:34:13

标签: python django django-models django-forms

尝试实现轮询创建系统,我可以用选择创建问题(之前我在管理员中完成了这一切,并且必须为每个选择创建一个单独的选择对象)

这是我的模特:

class Question(models.Model):
    has_answered = models.ManyToManyField(User, through="Vote")
    question_text = models.CharField(max_length=80)
    date = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.question_text


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=100)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

现在,这是模板:

<form method="post" action="">{% csrf_token %}
    {{ question_form.question_text }}
    <br><br>
    <!--{{ choice_form.choice_text|placeholder:"Choice" }}-->
    <input class="choice" name="choice_text" placeholder="Choice" type="text" />
    <input class="choice" name="choice_text" placeholder="Choice" type="text" />
    <input class="choice" name="choice_text" placeholder="Choice" type="text" />

    <img src="{% static 'images/plus.png' %}" class="add_choice" />
    <br>

    <button class="submit" type="submit">Create question</button>


</form>

正如您所看到的,我不确定是否可以使用多个{{ choice_form.choice_text|placeholder:"Choice" }}。因此,我粘贴了多个输入字段,并尝试使用getList()获取所有这些字段。但是我收到了这个错误:

'QueryDict' object has no attribute 'getList'

知道为什么吗?以下是我的观点:

def questions(request):
    question_form = QuestionForm(request.POST or None)
    choice_form = ChoiceForm(request.POST or None)
    if request.POST:
        choice = request.POST.getList('choice_text')
        print(choice)
    if request.user.is_authenticated():
        if question_form.is_valid():
            print('valid question')
            #question = question_form.save(commit=False)

    return render(request, 'questions.html', {'question_form': question_form, 'choice_form': choice_form})

那么我应该怎么做才能抓住每一个选择输入呢?最终,我想让所有这些选择映射到输入的问题。但正如我所说,我确定是否可以在一种形式中拥有同一字段的多个实例。

1 个答案:

答案 0 :(得分:0)

尝试使用import java.util.Scanner; public class Student {Scanner scan = new Scanner(System.in); //Instance Data String studentName; String studentID; String streetAddress; String city; String state; String zipCode; String major; int totalCredits; final int SIZE = 6; final int MAX_CREDITS = 18; String [ ] schedule = new String [SIZE]; int courseNumber = 0; //start out with no courses //Create Constructor: //Initializes the student data at instantiation time. //------------------------------------------------------- // Sets up the student's information. //------------------------------------------------------- public Student (String name, String id, String address, String cityName, String stateName, String zip, String area ) { studentName = name; studentID = id; streetAddress = address; city = cityName; state = stateName; zipCode = zip; major = area; }//end Student Constructor //Method to Return student information as string: //------------------------------------------------------- // Returns the student information as a formatted string. //------------------------------------------------------- public String toString() { String studentInfo; studentInfo = "Name:\t\t\t" + studentName + "\n" + "ID:\t\t\t" + studentID + "\n" + "Address:\t\t" + streetAddress + "\n" + "City:\t\t\t" + city + "\n" + "State:\t\t\t" + state + "\n" + "Zip Code:\t\t" + zipCode + "\n" + "Major:\t\t\t" + major + "\n"; return studentInfo; }// end toString //Method to determine if maximum allowed credits have been exceeded //------------------------------------------------------- // Returns true if total credits does not exceed 18. //------------------------------------------------------- private boolean checkCredits(int numCredits) { if (numCredits + totalCredits <= MAX_CREDITS) //make sure max credits not exceeded { return true; //return a true if still less than 18 credits } else { return false; //return a false if 18 credit limit is exceeded }//end numCredits }//checkCredits //Method to add a course to the student’s schedule //------------------------------------------------------- // Adds a course to the array if total credits does not exceed 18. //------------------------------------------------------- public void addCourse(String course, int numCredits) { if (courseNumber < SIZE ) //make sure array is not full. { if (checkCredits(numCredits) == true) //if we’re under 18 credits { //add course schedule [courseNumber] = course + ":\t\t" + numCredits + "\tCredits\n"; //increment number of credits totalCredits = totalCredits + numCredits; //increment number of courses courseNumber = courseNumber + 1; } else //oops – can’t do more than 18 credits { System.out.println("You have exceeded the maximum allowed credits."); }//end checkCredits } else //oops – can’t do more than 10 courses { System.out.println("You have exceeded 10 courses."); }//end courseNumber }//addCourse //Method to display the schedule //------------------------------------------------------- // Will only print out the courses added to the array. //------------------------------------------------------- public void displaySchedule( ) { for (int index = 0; index < courseNumber; index++) { System.out.println("Course #" + (index + 1) + " " + schedule[index] + "\n"); }//end for }//end display schedule } 代替getlist

另请考虑使用forms,具体而言,MultipleChoiceField在您的方案中非常有用。