在Django DetailView中发表评论

时间:2019-01-20 18:47:15

标签: python django django-forms

我需要在文章页面添加评论。发布请求接收到数据但未保存。

在models.py中:

#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>

byte RED = 14;
byte GREEN = 12;
byte BLUE = 13;
byte PIN_COUNT = 20;
Adafruit_NeoPixel ledstrip = Adafruit_NeoPixel(PIN_COUNT, 6, NEO_RGB + NEO_KHZ800); //(num of leds, )
WiFiServer server(port);

void setup()
{
    Serial.begin(115200);
    delay(10);
    ledstrip.begin();        

    Serial.print("Connecting to: ");
    Serial.println(ssid);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    byte tries;
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        tries++;
        Serial.println(".");
        if (tries == 5)
        {
            Serial.println("Connection failed");
            return;
        }
    }
    Serial.println("\nWiFi connected");

    server.begin();
    Serial.println("Server URL: ");
    Serial.print(WiFi.localIP());
}
void print_tokens(char* strings)
{   
    byte index = sizeof(strings);
    for (int n = 0; n < index; n++)
    {
        Serial.println(strings[n]);
    }
}

char *tokenize_request(String request)
{
    char requestArray[1024];
    char *ptr = NULL;
    byte index = 0;
    char *strings[10];

    strcpy(requestArray, request.c_str());
    ptr = strtok(requestArray, ";");

    while (ptr != NULL) {
        strings[index] = ptr;
        index++;
        ptr = strtok(NULL, ";");
    }
    return *strings;
}

void loop()
{
    WiFiClient responder = server.available();
    if (!responder)
    {
        return;
    }
    while (!responder.available())
    {
        delay(1);
    }

    String request = responder.readStringUntil('@');
    char *strings[10] = {tokenize_request(request)};

    print_tokens(*strings);

    int mode = atoi(strings[0]);
    int R = atoi(strings[1]);
    int G = atoi(strings[2]);
    int B = atoi(strings[3]);

    if (mode == 1)
    {
        ledstrip.setPixelColor(5, R, G, B);
    }

    if (mode == 0)
    {
        ledstrip.setPixelColor(5, 0, 0, 0);
    }
    ledstrip.show();
    delay(1);
    Serial.println("------------------------------------------------------------------");
}

在forms.py中:

class TemporaryComment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='temporary_comment')
    email = models.EmailField()
    message = models.TextField(max_length=1500)
    timestamp = models.DateTimeField(auto_now_add=True)
    is_approved = models.BooleanField(default=True)

在views.py中:

class CommentModelForm(forms.ModelForm):

    class Meta:
        model = TemporaryComment
        fields = [
            'article',
            'email',
            'message',
        ]

如果我在forms.py中注释掉class ArticleDetailView(FormMixin, DetailView): model = Article template_name = 'article.html' form_class = CommentModelForm def get_success_url(self): return reverse_lazy('main:article', kwargs={'pk': self.object.pk}) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['last_articles'] = Article.objects.filter(is_active=True).order_by('-timestamp')[:10] context['comments'] = self.object.temporary_comment.filter(is_approved=True) context['form'] = self.get_form() return context def post(self, request, *args, **kwargs): self.object = self.get_object() form = self.get_form() if form.is_valid(): return self.form_valid(form) else: return self.form_invalid(form) def form_valid(self, form): form.save() return super().form_valid(form) 字段,则出现此错误:

article

我们将很乐意接受帮助。感谢您的宝贵时间。

1 个答案:

答案 0 :(得分:0)

应该将其注释掉,然后将其设置在form_valid中。

def form_valid(self, form):
    form.instance.article = self.object
    form.save()
    return super().form_valid(form)